使用 JWT 创建 Firebase 自定义身份验证令牌

Posted

技术标签:

【中文标题】使用 JWT 创建 Firebase 自定义身份验证令牌【英文标题】:Create Firebase custom auth token using JWT 【发布时间】:2019-10-25 17:06:47 【问题描述】:

为了创建 firebase 自定义身份验证令牌,我使用的是第三方 JWT 库 (https://github.com/jwtk/jjwt)

在这个库中,有一个选项可以添加 firebase 自定义令牌声明,例如(alg、iss、sub、aud、iat 等)

所有 firebase 信息都可以在 https://firebase.google.com/docs/auth/admin/create-custom-tokens#create_custom_tokens_using_a_third-party_jwt_library 获得

private_key = "-----BEGIN PRIVATE KEY-----... -----END PRIVATE KEY-----";

我在 signWith 方法中传递了私钥,使用 base64 编码

 val encodeKey = Base64.encode(privateKey.toByteArray(), android.util.Base64.DEFAULT)

 val jwt = Jwts.builder().setIssuer("firebase-adminsdk-kywht@...")
                .setSubject("firebase-adminsdk-kywht@...")
                .setAudience("https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit")
                .setExpiration(calendar.time) //a java.util.Date
                .setIssuedAt(Date())
                .setId(UUID.randomUUID().toString())signWith(SignatureAlgorithm.RS512 ,encodeKey).compact()

我已经使用了上面的代码,但是没有用。 有人知道如何传递私钥来生成令牌吗?

【问题讨论】:

【参考方案1】:

第一件事是你是否不小心错过了代码中的一个点,所以把它放好,signWith() 的参数不正确,即第一个参数是密钥,第二个是签名算法。试试这个:

val encodeKey = Base64.encode(privateKey.toByteArray(), android.util.Base64.DEFAULT)

val jwt = Jwts.builder().setIssuer("firebase-adminsdk-kywht@...")
            .setSubject("firebase-adminsdk-kywht@...")
            .setAudience("https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit")
            .setExpiration(calendar.time) //a java.util.Date
            .setIssuedAt(Date())
            .setId(UUID.randomUUID().toString())
            .signWith(encodeKey, SignatureAlgorithm.RS512) //changed here
            .compact()

【讨论】:

Ujjwal Jung Thapa,为了安全起见,我在末尾加了一个点。正如您建议的那样,使用 signWith(encodeKey, SignatureAlgorithm.RS512)。但是第一个参数需要java.security.Key对象,encodeKey其实是字符串。 Ujjwal Jung Thapa,你知道如何将这个 private_key 转换成 java.security.Key 吗?

以上是关于使用 JWT 创建 Firebase 自定义身份验证令牌的主要内容,如果未能解决你的问题,请参考以下文章

使用 php 设置 firebase v3 自定义身份验证

使用 IdentityServer 与创建基于 JWT 的自定义身份验证

Firebase 不接受从 Google Identity Platform 的 REST API 获取的 JWT:“自定义令牌格式不正确。”

Firebase php-jwt 令牌刷新

如何为 Firebase (Kotlin) 创建自定义身份验证

使用 .NET Core 的 Firebase 身份验证 (JWT)