Fau*_*tus 17 node.js firebase firebase-authentication
我正在尝试验证idToken后端.用户已成功登录到firebase客户端,但当我尝试验证后端的idToken时,我得到的这个不是非常有用的错误消息
Firebase身份验证ID令牌具有错误的"aud"声明
错误消息似乎变得更有用,并归结为在auth密钥中没有项目名称:
错误:Firebase ID令牌具有错误的"aud"(受众群体)声明.预计"stripmall-0000"但得到"617699194096-0aafcvsml0gke61d6077kkark051f3e1.apps.googleusercontent.com".确保ID令牌来自与用于对此SDK进行身份验证的服务帐户相同的Firebase项目.有关如何检索ID令牌的详细信息,请参阅 https://firebase.google.com/docs/auth/server/verify-id-tokens.
任何有丝毫想法的人都会出错?我从客户端正确收到tokenId,这应该不是问题.真诚的应用,如果之前已经被问过,或者以任何其他方式是微不足道的.
firebase.initializeApp({
serviceAccount: {
"type": "service_account",
"project_id": <project id here>,
"private_key_id": <key id goes here>,
"private_key": <key goes here>
"client_email": <email goes here>,
"client_id": <my client id>,
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://accounts.google.com/o/oauth2/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": <url goes here>
},
databaseURL: <my db url here>
});
router.post("/verify", function (req, res) {
firebase.auth().verifyIdToken(req.body.idToken).then(function (decodedToken) {
var uid = decodedToken.sub;
res.send(uid);
}).catch(function (error, param2) {
console.log(error); // 'Firebase Auth ID token has incorrect "aud" claim'
});
});
Run Code Online (Sandbox Code Playgroud)
Rob*_*kal 19
您的问题可能是您正在尝试使用其中一个auth()函数返回的JWT令牌firebaseRef.auth().signInWithPopup().这些确实会返回JWT令牌,但是auth声明可能会出错,并且不会通过验证verifyIdToken.这得到了firebase技术支持的证实.
你必须使用该 firebaseRef.auth().currentUser.getToken()功能.该令牌将通过验证.
TLDR:正如另一个答案中提到的,您没有正确初始化应用程序。
虽然我在这方面有点晚了,但我也遇到了同样的问题,所以我决定深入了解幕后发生了什么。
首先,除非 API 在提出这个问题后发生了变化,否则它serviceAccount不会作为接口的一部分的属性存在AppOptions,这可能就是您收到错误的原因。所以我假设你所拥有的东西应该在钥匙中credential。
其次,您会看到此错误在https://github.com/firebase/firebase-admin-node/blob/master/src/auth/token-verifier.ts引发(撰写本文时第 187 行),其中aud令牌中的声明与 进行比较this.projectId。
现在,正如其他答案提到的,这可能是因为您尝试验证的令牌不是在客户端创建的,而是通过其他自定义方法创建的,在这种情况下,声明aud可能不存在,完全随机的东西,或者其他东西这绝对不等于你的projectId,所以你应该先检查一下。
但是,如果您确定令牌是在客户端创建的,那么它可以归结为projectId未设置,或者至少未按照您期望的方式设置。如果您查看https://github.com/firebase/firebase-admin-node/blob/master/src/utils/index.tsgetProjectId()中的方法(撰写本文时的第 66 行),您会发现通过以下 3 种方式之一确定:直接从对象、从中的属性、或从。这意味着,如果未设置并且您的项目托管在 GCloud 上(我假设是),那么 Google 将自动使用您当前环境的projectId 来处理与 firebase-auth 相关的任何内容,而不是原始项目的projectId。projectIdapp.optionsprojectIdapp.options.credentialprocess.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECTprojectIdstripmall-0000
所以,三个选择:
projectId直接在中设置初始化您的应用程序AppOptions:
firebase.initializeApp({
databaseURL: <my db url here>,
// Set your projectId directly here in options:
projectId: <your-projectId-here>
});
Run Code Online (Sandbox Code Playgroud)或者通过正确设置凭据对象可能更好地做到这一点:
firebase.initializeApp({
credentials: admin.credential.cert(<<path-to-your-certificate> || <admin.ServiceAccount object>>),
databaseURL: <my db url here>
});
Run Code Online (Sandbox Code Playgroud)或者,只需将应用程序托管在与 Firebase 应用程序相同的项目中(现在它们是同一生态系统的一部分),以便环境变量相同。(实际上并不是 100% 对此,但我假设这就是 firebase-functions 又名 cloud-functions 的工作原理)
| 归档时间: |
|
| 查看次数: |
4112 次 |
| 最近记录: |