2

我刚刚开始使用 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 应归咎于此类令牌?还是我在某个地方错了。

任何帮助将不胜感激,因为我快疯了:)

4

0 回答 0