【问题标题】:Firebase Verifying ID TokensFirebase 验证 ID 令牌
【发布时间】:2017-01-24 22:36:05
【问题描述】:

我有一个服务器应用程序,我正在尝试识别该服务器上当前登录的用户。我已经成功地在我的网络应用上对用户进行了身份验证,如下所示:

    var provider = new firebase.auth.GoogleAuthProvider();          
    firebase.auth().signInWithPopup(provider).then(function(result) {
        userJsonToken = result.credential.accessToken;
        user = result.user;
    }).catch(function(error) {
        // Handle Errors here.
        var errorCode = error.code;
        var errorMessage = error.message;
        // The email of the user's account used.
        var email = error.email;
        // The firebase.auth.AuthCredential type that was used.
        var credential = error.credential;
    });

然后我通过 ajax 调用将 userJsonToken 发送到我的服务器,我可以在调试时看到令牌,因此令牌被正确发送到服务器。

在我的服务器应用程序中,我正在这样做:

try (InputStream is = FirebaseUtil.class.getClassLoader().getResourceAsStream(FIREBASE_CREDENTIALS_JSON_FILE)) {
    FirebaseOptions options = new FirebaseOptions.Builder().setServiceAccount(is).setDatabaseUrl(FIREBASE_DATABASE_URL).build();        
    FirebaseApp.initializeApp(options);
} catch (IOException e) {
    e.printStackTrace(System.err);
}

然后我做:

    FirebaseAuth.getInstance().verifyIdToken(idToken).addOnFailureListener(new OnFailureListener() {            
        @Override
        public void onFailure(Exception ex) {
            throw new AuthenticationServiceException(ex.getMessage(), ex);
        }
    }).addOnSuccessListener(new OnSuccessListener<FirebaseToken>() {
        @Override
        public void onSuccess(FirebaseToken token) {
            System.out.println("Yeehaw");
        }
    }).addOnCompleteListener(new OnCompleteListener<FirebaseToken>() {          
        @Override
        public void onComplete(Task<FirebaseToken> arg0) {
            System.out.println(arg0.isSuccessful());
        }
    });

此时,OnFailureListener 被调用。我收到一个 java.lang.IllegalArgumentException ,但没有解释为什么或发生了什么。无论如何,我是否可以在 Firebase 上看到日志,以了解所发生的事情?谢谢

这是完整的错误:

Caused by: java.lang.IllegalArgumentException
at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:111)
at com.google.api.client.util.Preconditions.checkArgument(Preconditions.java:37)
at com.google.api.client.json.webtoken.JsonWebSignature$Parser.parse(JsonWebSignature.java:602)
at com.google.firebase.auth.FirebaseToken.parse(FirebaseToken.java:81)
at com.google.firebase.auth.FirebaseAuth$1.call(FirebaseAuth.java:143)
at com.google.firebase.auth.FirebaseAuth$1.call(FirebaseAuth.java:140)
at com.google.firebase.tasks.Tasks$1.run(Tasks.java:63)

【问题讨论】:

  • 您找到解决方法了吗?我现在也遇到了完全相同的错误,并且对如何调试它感到困惑,因为该异常根本没有提供任何信息

标签: node.js firebase firebase-authentication


【解决方案1】:

自己遇到了这个问题,在这里没有找到答案后,决定查看源代码本身。

/**
 * Parses a JWS token into a parsed {@link JsonWebSignature}.
 *
 * @param tokenString JWS token string
 * @return parsed {@link JsonWebSignature}
 */
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(secondDot != -1);

显然,如果您的令牌没有至少 2 个点,它将在此处产生 IllegalArgumentException,而没有任何错误消息说明为什么会引发此错误。

在我的例子中,我遇到了这个错误,因为我使用的是我手工制作的假令牌,用于测试目的。我期待看到“令牌解码失败”类型的错误。果然,在我的 fake-token 添加了 2 个点之后,我遇到了一个更具描述性的错误消息:

Decoding Firebase ID token failed. Make sure you passed the entire string JWT which represents an ID token. See https://firebase.google.com/docs/auth/admin/verify-id-tokens for details on how to retrieve an ID token.

很遗憾,Firebase 团队没有为前 2 个先决条件提供更具描述性的错误消息,因为这样可以更好地提醒用户令牌格式错误/不完整的事实,并且该方式没有任何问题他们初始化或调用了 FirebaseAuth。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-04
    • 2019-04-09
    • 2018-07-23
    • 2018-05-28
    • 2019-06-28
    • 2020-02-10
    • 2019-02-26
    • 2021-05-04
    相关资源
    最近更新 更多