我刚刚开始使用 Firebase。React 应用程序 + Java 后端。
React 端授权运行良好,但是当我将用户的 id 令牌发送到后端并尝试验证是否使用 firebase 库时,我得到了一个异常。
我从文档中获取了所有代码。
在js客户端中:
firebase.auth().currentUser.getToken(/* forceRefresh */ true).then(function(idToken)...
在java中这失败了:
FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdTokenAsync(idToken).get();
String uid = decodedToken.getUid();
给我:
java.lang.IllegalArgumentException: null
at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:111) ~[google-http-client-1.22.0.jar:1.22.0]
at com.google.api.client.util.Preconditions.checkArgument(Preconditions.java:37) ~[google-http-client-1.22.0.jar:1.22.0]
at com.google.api.client.json.webtoken.JsonWebSignature$Parser.parse(JsonWebSignature.java:602) ~[google-http-client-1.22.0.jar:1.22.0]
at com.google.firebase.auth.FirebaseToken.parse(FirebaseToken.java:44) ~[firebase-admin-5.5.0.jar:na]
at com.google.firebase.auth.FirebaseAuth$2.call(FirebaseAuth.java:213) ~[firebase-admin-5.5.0.jar:na]
at com.google.firebase.auth.FirebaseAuth$2.call(FirebaseAuth.java:204) ~[firebase-admin-5.5.0.jar:na]
at com.google.firebase.tasks.Tasks$1.run(Tasks.java:82) ~[firebase-admin-5.5.0.jar:na]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_151]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_151]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_151]
我正在使用 - com.google.firebase - firebase-admin - 版本 5.5.0
通过 uid 进行的数据库操作和用户检索在 java 后端完美运行。
我下载了所有java源来跟踪错误,我发现“点”检查失败
Preconditions.checkArgument(secondDot != -1);
在类 JsonWebSignature 包 com.google.api.client.json.webtoken google-http-client-1.22.0.jar
public JsonWebSignature parse(String tokenString) throws IOException {
// split on the dots
int firstDot = tokenString.indexOf('.');
Preconditions.checkArgument(firstDot != -1);
byte[] headerBytes = Base64.decodeBase64(tokenString.substring(0, firstDot));
int secondDot = tokenString.indexOf('.', firstDot + 1);
Preconditions.checkArgument(secondDot != -1);
Preconditions.checkArgument(tokenString.indexOf('.', secondDot + 1) == -1);
...
当我将点添加到令牌的末尾时,然后检查通过并让用户返回。我想知道我是否做错了什么..是我的令牌格式正确还是java过于急于检查有效性
我从 firebase js 客户端收到的令牌格式为“Header.Payload”,它不包含 JWS RFC“Header.Payload.Signature”中的第二个点
是 webtoken 验证的问题吗?规范不需要第二个点,还是 firebase lib 应归咎于此类令牌?还是我在某个地方错了。
任何帮助将不胜感激,因为我快疯了:)