Javascript 在Firebase函数中,如何更新声明?
有人能帮我吗?我只想在Firebase函数中更新JWT声明。因此,我可以设置像IsAdmin等标志,并在实时数据库中使用它。我看过这篇文章 但我不能让任何组合起作用 这是我在登录后进行的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});
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嗨,你有时间看一下建议的答案吗?