未在REST服务器上验证Flutter App的Firebase Id令牌

时间:2019-12-17 22:08:48

标签: firebase authentication flutter

我想使用Firebase身份验证支持社交登录。但是我想将用户的详细个人资料保留在自己的RDB中。 我认为在用户使用社交帐户登录后,我可以获得包含用户ID和电子邮件的编码令牌。 然后,如果我将令牌发送到REST服务器(我是通过Spring Boot构建的),则服务器可以对其进行解码以从RDB加载用户的详细资料。

我遵循了本文的指南。 https://blog.codemagic.io/firebase-authentication-google-sign-in-using-flutter/

我可以看到登录过程成功完成,并且在控制台上打印了id令牌。 以下是flutter(dart)代码。

final GoogleSignInAccount googleSignInAccount = await googleSignIn.signIn();
final GoogleSignInAuthentication googleSignInAuthentication =
await googleSignInAccount.authentication;

final AuthCredential credential = GoogleAuthProvider.getCredential(
accessToken: googleSignInAuthentication.accessToken,
idToken: googleSignInAuthentication.idToken,
);

final AuthResult authResult = await _auth.signInWithCredential(credential);
final FirebaseUser user = authResult.user;
name = user.displayName;
email = user.email;
imageUrl = user.photoUrl;
final FirebaseUser currentUser = await _auth.currentUser();
await currentUser.getIdToken().then((value) => print(value.token));

我将令牌复制到服务器模块中以测试它可以正确解码。 我添加了firebase-admin依赖项。并使用下面的Java代码运行它。

FirebaseOptions options = new FirebaseOptions.Builder()
.setCredentials(GoogleCredentials.getApplicationDefault())
.setDatabaseUrl("https://test-firebase-auth-token.firebaseio.com")
.build();
FirebaseApp.initializeApp(options);

String firebaseToken = "eyJhbGciOiJSUzI1NiIsImtpZCI6ImQ1OThkYjVjZ..."; // actually it's long string.

FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdToken(firebaseToken);
System.out.println(decodedToken.getUid());
System.out.println(decodedToken.getEmail());

我得到一个错误。

Exception in thread "main" com.google.firebase.auth.FirebaseAuthException: Failed to verify the signature of Firebase ID token. See https://firebase.google.com/docs/auth/admin/verify-id-tokens for details on how to retrieve an ID token.
    at com.google.firebase.auth.FirebaseTokenVerifierImpl.checkSignature(FirebaseTokenVerifierImpl.java:154)
    at com.google.firebase.auth.FirebaseTokenVerifierImpl.verifyToken(FirebaseTokenVerifierImpl.java:92)
    at com.google.firebase.auth.FirebaseAuth$4.execute(FirebaseAuth.java:426)
    at com.google.firebase.auth.FirebaseAuth$4.execute(FirebaseAuth.java:423)
    at com.google.firebase.internal.CallableOperation.call(CallableOperation.java:36)
    at com.google.firebase.auth.FirebaseAuth.verifyIdToken(FirebaseAuth.java:388)
    at com.google.firebase.auth.FirebaseAuth.verifyIdToken(FirebaseAuth.java:362)
    at com.example.demo.DemoApplicationTests.main(DemoApplicationTests.java:36)

我再次使用firebase-server-sdk依赖项而不是firebase-admin进行了尝试。 然后我又收到一条错误消息。 (似乎是由与上述错误消息相同的原因引起的)

Caused by: com.google.firebase.auth.FirebaseAuthException: Token isn't signed by a valid public key
    at com.google.firebase.auth.internal.FirebaseTokenVerifier.verifyTokenAndSignature(FirebaseTokenVerifier.java:61)
    at com.google.firebase.auth.FirebaseAuth$1.call(FirebaseAuth.java:146)
    at com.google.firebase.auth.FirebaseAuth$1.call(FirebaseAuth.java:140)
    at com.google.firebase.tasks.Tasks$1.run(Tasks.java:63)

我在此网站上检查了令牌。 https://jwt.io/

enter image description here

我想知道令牌真的是用(私钥)签名的吗? 那么jwt.io网站如何在不知道密钥的情况下对其进行解码?

似乎它只是用像base64这样的开放算法编码的。是不是 如果是这样,令牌将不再安全。

我的应用程序有什么问题。还是我对安全性有误解? 任何意见将受到欢迎。谢谢...

0 个答案:

没有答案