Javascript 在Firebase函数中,如何更新声明?

Javascript 在Firebase函数中,如何更新声明?,javascript,firebase,firebase-authentication,google-cloud-functions,firebase-admin,Javascript,Firebase,Firebase Authentication,Google Cloud Functions,Firebase Admin,有人能帮我吗?我只想在Firebase函数中更新JWT声明。因此,我可以设置像IsAdmin等标志,并在实时数据库中使用它。我看过这篇文章 但我不能让任何组合起作用 这是我在登录后进行的firebase函数调用。这个问题与本地调试有关吗?我可以在本地测试吗 import * as functions from 'firebase-functions'; const cors = require('cors'); const corsHandler = cors({origin: true});

有人能帮我吗?我只想在Firebase函数中更新JWT声明。因此,我可以设置像IsAdmin等标志,并在实时数据库中使用它。我看过这篇文章 但我不能让任何组合起作用

这是我在登录后进行的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 web应用程序在本地调用此功能。使用以下代码

    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 post工作正常。但在本地调试时返回以下内容


{“status”:{“code”:“app/invalid credential”,“message”:“通过\“credential\”属性提供给initializeApp()的凭据实现无法获取有效的Google OAuth2访问令牌,出现以下错误:\”获取访问令牌时出错:发出请求时出错:getaddrinfo ENOTFOUND metadata.google.internal metadata.google.internal:80.错误代码:ENOTFOUND\““}}}

You
resetClaims
云函数声明为,因为您执行了以下操作:

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
    });

});

请注意,如中所述:

可调用函数与HTTP函数有以下主要区别:

  • 对于可调用项,Firebase身份验证和FCM令牌(如果可用)将自动包含在请求中
  • functions.https.onCall触发器自动反序列化请求主体并验证身份验证令牌

身份验证/用户信息自动添加到请求中(
context
参数表示用户身份验证信息)


请编辑此问题,以便更清楚地了解调用此函数所采取的步骤。另外,您应该知道,您应该只初始化AdminSDK一次。在每次函数调用时调用它可能不是一个好主意。谢谢将做出此更改。现在我只是想让它工作起来。当“在本地调试”时,你到底在做什么。请具体说明。您正在使用Firebase emulator套件吗?你是如何调用函数的?@Anubis嗨,你有时间看一下建议的答案吗?