Как загрузить файлы в Firebase Storage с помощью идентификатора пользователя и токена, полученных с помощью REST API - PullRequest
0 голосов
/ 02 ноября 2019

Я пытаюсь загрузить файл для загрузки изображения в Firebase Storage с правилом, согласно которому пользователь может писать только в свой профиль пользователя. Ниже приведены мои правила хранения

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /users/{userId}/{allPaths=**} {
      allow read: if request.auth != null; 
      allow write: if request.auth.uid == userId;
    }
  }
}

Однако, когда я загружаю изображение, я получаю ошибку об отказе в доступе. Я уверен, что я покрыл все другие углы относительно того, почему это пошло не так. Единственное, о чем я могу думать, это то, что мой идентификатор пользователя не отправляется в хранилище Firebase правильно. Я получаю свой токен и идентификатор пользователя от отправки запроса POST. Это моя функция регистрации

return async dispatch => {
        const response = await fetch(
            'https://identitytoolkit.googleapis.com/v1/accounts:signUp?key={MYKEY}',
            {
                method: 'POST',
                headers: {
                    'Content-Type' : 'application/json'
                },
                body: JSON.stringify({
                    email: email,
                    password: password,
                    returnSecureToken: true
                })
            }
        );
        if (!response.ok) {
            const errorData = await response.json()
            const errorId = errorData.error.message;
            let message = 'Something went wrong!'
            if (errorId === 'EMAIL_EXISTS') {
                message = 'The email entered already exists';
            }
            throw new Error(message);
        }
        const resData = await response.json()
      dispatch(authenticate(resData.localId,resData.idToken,parseInt(resData.expiresIn) * 1000, resData.refreshToken))

Есть ли какие-либо проблемы совместимости с токеном и userId, которые вы получаете из REST API и хранилища firebase. И если есть, каково решение для загрузки изображений в хранилище Firebase.

Это также моя функция uploadImage.

const uploadImage = async (uri, name) => {
        const response = await fetch(uri);
        const blob = await response.blob();
        console.log(response)
        console.log(blob)
        var storageRef = firebase.storage().ref();
        var profilePhotoRef = storageRef.child(`users/${uid}/${name}`);
        return profilePhotoRef.put(blob);
    };

Спасибо.

1 Ответ

1 голос
/ 02 ноября 2019

Только когда вы используете Firebase Authentication SDK для входа в систему, идентификатор пользователя будет отправлен вместе с загрузками и выгрузками файлов для использования в правилах безопасности. Проверка подлинности с помощью REST API вручную не будет работать.

...