В Firebase Functions как вы обновляете заявки? - PullRequest
0 голосов
/ 14 марта 2020

Может кто-нибудь мне помочь? Все, что я хочу сделать, это обновить утверждения JWT в функции Firebase. Таким образом, я могу установить флаг как IsAdmin et c и использовать его в БД в реальном времени. Я видел эту статью https://firebase.google.com/docs/auth/admin/custom-claims, но не могу заставить работать любую комбинацию.

Это мой вызов функции firebase, который я выполняю после входа в систему. Связана ли эта проблема с локальная отладка? Могу ли я проверить это локально?

import * as functions from 'firebase-functions';

const cors = require('cors');
const corsHandler = cors({origin: true});
const admin = require('firebase-admin');

admin.initializeApp();

export const resetClaims = functions.https.onRequest((req : any, res : any) => {
    corsHandler(req, res, () => {

        admin.auth().verifyIdToken(req.header("authorization").replace("Bearer ", '')).then((claims : any) => {
            var uid = claims.uid;

            admin.auth().setCustomUserClaims(uid, {test: true}).then(() => {
                // The new custom claims will propagate to the user's ID token the
                // next time a new one is issued.
              }).catch((er : any)=>{
                res.end(JSON.stringify({
                    status: er
                }));
                return;
            });
              return;
    });


});

Я вызываю это локально из веб-приложения Firebase. Используя следующий код

    const resetClaims = async ()=> {
        const fn = firebase.functions().httpsCallable('resetClaims');
        const res = await fn();
        firebase.auth().currentUser.getIdToken(true);
        alert(res.data.status);
    }

firebase.auth().onAuthStateChanged(function (user) {
            if (user) {
                resetClaims();
                setUsername(user.displayName);
            } else {
                setUsername('');
            }
        });

Пост http работает. Но возвращает следующее при локальной отладке.

{"status": {"code": "app / invalid-credential", "message": "Реализация учетных данных, предоставленная для initializeApp () через \" credential \ " "свойству не удалось получить действительный токен доступа Google OAuth2 со следующей ошибкой: \" Ошибка при получении токена доступа: ошибка при выполнении запроса: getaddrinfo ENOTFOUND metadata.google.internal metadata.google.internal: 80. Код ошибки: ENOTFOUND \ "."}}

1 Ответ

1 голос
/ 14 марта 2020

You resetClaims Облачная функция объявлена ​​как HTTP Cloud Function , так как вы делаете:

export const resetClaims = functions.https.onRequest(...)

, но в своем интерфейсе вы называете ее, как если бы она была Функция вызываемого облака .

Вы должны адаптировать свою функцию облака следующим образом:

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();

export const resetClaims = functions.https.onCall((data, context) => {

    const uid = context.auth.uid;

    return admin.auth().setCustomUserClaims(uid, {test: true})
    .then(() => {      
       return {result: "successful"};
    })
    .catch(error => {
       //See  https://firebase.google.com/docs/functions/callable#handle_errors
    });

});

Обратите внимание, что, как описано в do c:

У вызывающих элементов есть следующие основные отличия от функций HTTP:

  • При наличии вызываемых элементов, маркеры Firebase Authentication и FCM, если они доступны, автоматически включаются в запросы.
  • Триггер functions.https.onCall автоматически десериализует тело запроса и проверяет токены аутентификации.

и

Аутентификация / пользователь информация автоматически добавляется в запрос (context параметры представляют информацию об аутентификации пользователя)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...