我有一个前端,该前端通过Firebase托管。该代码使用Firebase身份验证,并通过user.getIdToken()
检索令牌。根据类似问题的答案,这是必经之路。
后端使用Python编写,需要令牌并使用firebase_admin SDK对其进行验证。在本地计算机上,将FIREBASE_CONFIG
设置为从项目中导出的firebase-auth.json
的路径。一切都按预期进行。
现在,我通过Google AppEngine部署了后端。在这里,我在app.yaml中将FIREBASE_CONFIG
配置为JSON字符串。代码如下:
runtime: python37
env_variables:
FIREBASE_CONFIG: '{
"type": "service_account",
"project_id": "[firebase-project-name]",
...
后端在启动时记录FIREBASE_CONFIG
的值。在日志中,我可以看到JSON字符串存在,并且{
是第一个字符。所以一切对我来说看起来都很不错。但是,如果我从客户端检索令牌并尝试对其进行验证(相同的代码,该代码在本地运行),则会出现此错误:
Firebase ID令牌具有错误的“ aud”(听众)声明。预期 “ [backend-appengine-project-name]”,但获得了“ [firebase-project-name]”。确保ID令牌 来自与用于服务帐户相同的Firebase项目 验证此SDK。
有人可以解释一下,我缺少什么以及如何解决吗?
答案 0 :(得分:0)
该错误消息听起来像您的客户端应用程序的用户已登录到与您的后端不同的Firebase项目。从字面上看错误消息,客户端使用“ backend-appengine-project-name”,但是您的后端使用“ firebase-project-name”。确保将它们都配置为使用相同的项目ID和相同的项目。
答案 1 :(得分:0)
final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
final GoogleSignInAuthentication googleAuth = await googleUser.authentication;
final AuthCredential credential = GoogleAuthProvider.getCredential(
accessToken: googleAuth.accessToken,
idToken: googleAuth.idToken,
);
final FirebaseUser user = (await _auth.signInWithCredential(credential)).user;
IdTokenResult idTokenResult = await user.getIdToken(refresh: true);
print("userIdToken:" + idTokenResult.token);