Отсутствие или недостаточные разрешения при публикации документа в Firestore с использованием пользовательского токена - PullRequest
0 голосов
/ 21 апреля 2020

Конечная цель: моя компания начнет использовать Firestore для обновления статуса транзакции в нашем мобильном приложении и Angular 9 веб-интерфейсе.

Немедленная задача: узнать, как использовать Custom Token.

Текущая проблема : Я получаю эту ошибку, хотя она является владельцем:

  "error": {
    "code": 403,
    "message": "Missing or insufficient permissions.",
    "status": "PERMISSION_DENIED"
  }

Я не могу понять, почему получаю PERMISSION_DENIED, если idToken связан с владельцем коллекции.

Администратор IAM, показывающий, что пользователь является владельцем :

iam admin

settings iam

Шаги для воспроизведения:

1 - I успешно можно получить пользовательский токен из этого кода, опубликованного на https://us-central1-firetestjimis.cloudfunctions.net/getCustomToken

import * as functions from 'firebase-functions';
import * as admin from "firebase-admin";

export const getCustomToken = functions.https.onRequest((request, response) => {
    if (admin.apps.length < 1) {   //Checks if app already initialized
        admin.initializeApp();
    }
    const uid = "User UID copied from https://console.firebase.google.com/project/firetestjimis/authentication/users"; 

    admin.auth().createCustomToken(uid)
        .then(function (customToken) {
            console.log(customToken.toString);
            response.send(customToken);
        })
        .catch(function (error) {
            console.log("Error creating custom token:", error);
        });
});

2 - я могу успешно опубликовать этот пользовательский токен на https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken и получить назад idTken как

{
  "kind": "identitytoolkit#VerifyCustomTokenResponse",
  "idToken": "eyJhbGciOiJSUzI1NiI ... .... aMorw",
  "refreshToken": "AE0u-Ney9OJ04Z3xA7ACsmI1S637hXeuCTEdaEU9cxhhPnlwh-9q0X7QpSxVRIYdTdrTgXUbS9Q6yUdAWVeXzhGMiLLLHtwSWSoVSWnZs3Gp1Sb050tThNPQiSsSss8GkCigft3PTBkY4nIbRy3A5dA8FHCLbMYQSfKYqvu8To76UyMVCYONJOM",
  "expiresIn": "3600",
  "isNewUser": false
}

8 - Теперь я хочу опубликовать простой документ в коллекцию Firestore throw

curl --location --request POST 'https://firestore.googleapis.com/v1/projects/firetestjimis/databases/(default)/documents/transfer' \
--header 'Authorization: Bearer eyJhbGc ... ... iNaMorw' \
--header 'Content-Type: application/json' \
--data-raw '{
  "fields": {
    "id": {
      "stringValue": "1"
    },      
    "status": {
      "stringValue": "fracasso"
    }
  }
}'

и получаю указанную выше ошибку.

IN Если это уместно, вот коллекция, созданная вручную:

collection manually created

** * edit

Правила:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    match /{document=**} {
      allow read: if false;
      allow update, write: if request.auth.uid != null;
    }
  }
}

Желание:

Каждый может читать, но создавать и обновлять может только публикация с действительным idToken, полученным из пользовательского токена.

...