使用 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 自定义身份验证令牌的主要内容,如果未能解决你的问题,请参考以下文章
使用 IdentityServer 与创建基于 JWT 的自定义身份验证
Firebase 不接受从 Google Identity Platform 的 REST API 获取的 JWT:“自定义令牌格式不正确。”