Android Firebase登录无效的idToken

时间:2019-03-24 02:16:32

标签: android firebase kotlin

我正在尝试使用Firebase进行身份验证,但是我目前面临一些奇怪的问题。

在我的后端,我正在使用它来验证令牌:

async getUser(token: string) {
    const ticket = await client.verifyIdToken({
        idToken: token,
        audience: CLIENT_ID
    });

    const payload = ticket.getPayload();
    const userid = payload.sub;

    ...
}

当我从IdpResponse.fromResultIntent(data)发送此令牌时,一切正常。

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if (requestCode == RC_SIGN_IN) {
        val response = IdpResponse.fromResultIntent(data)

        if (resultCode == Activity.RESULT_OK) {
            response?.idpToken?.let {
                val loginRepo = LoginRepository(this)
                loginRepo.login(Login(it), {}, {})
            }
        } else {
            ...
        }
    }
}

但是当我从currentUser发送令牌时,async getUser(token: string)总是抛出异常。

val user = FirebaseAuth.getInstance().currentUser
if (user != null) {
    user.getIdToken(false).addOnCompleteListener {
        if (it.isSuccessful) {
            val token = it.result?.token
            val loginRepo = LoginRepository(this)
            token?.let { loginRepo.login(Login(it), {
                ...
            }, {
                ...
            }) }
        }
    }
} 

引发异常:

  

错误:找不到信封的pem:   {“ alg”:“ RS256”,“ kid”:“ ...”,“ typ”:“ JWT”}

在使用时:从idpResponse检索的https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123令牌可以正常工作,但从currentUser检索的其他令牌则不能,返回:

  

{       “错误”:“ invalid_token”,       “ error_description”:“无效值”}

如何从currentUser获取idpToken?为什么idToken不起作用?

1 个答案:

答案 0 :(得分:0)

您可能需要查看Firebase文档:

https://firebase.google.com/docs/auth/admin/verify-id-tokens

FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
mUser.getIdToken(true)
    .addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
        public void onComplete(@NonNull Task<GetTokenResult> task) {
            if (task.isSuccessful()) {
                String idToken = task.getResult().getToken();
                // Send token to your backend via HTTPS
                // ...
            } else {
                // Handle error -> task.getException();
            }
        }
    });