我想使用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/
我想知道令牌真的是用(私钥)签名的吗? 那么jwt.io网站如何在不知道密钥的情况下对其进行解码?
似乎它只是用像base64这样的开放算法编码的。是不是 如果是这样,令牌将不再安全。
我的应用程序有什么问题。还是我对安全性有误解? 任何意见将受到欢迎。谢谢...