是否可以从服务器(Java)验证 Firebase 令牌(JWT)

Posted

技术标签:

【中文标题】是否可以从服务器(Java)验证 Firebase 令牌(JWT)【英文标题】:Is it possible to validate a firebase token (JWT) from server (Java) 【发布时间】:2016-08-04 19:45:07 【问题描述】:

浏览器客户端 - 使用 Firebase 登录并在本地存储中拥有 firebase 用户 ID、令牌。


  "typ": "JWT",
  "alg": "HS256"


  "v": 0,
  "d": 
    "provider": "password",
    "uid": "xxxxd757-5f7f-xx0c-adb1-xxe8ce77d3a0"
  ,
  "iat": 1460560833
 

当浏览器调用服务器 - 一个 REST API 端点时,令牌作为请求标头传递。

现在,服务器配置了 Firebase Secret。

我的问题:是否可以在服务器端验证 firebase 颁发的令牌?服务器不用于身份验证(用户名/pass 验证是通过浏览器中的 firebase api 完成的)。

【问题讨论】:

【参考方案1】:

我建议这个库:https://github.com/auth0/java-jwt

具有非常简洁的 API 的开源项目,来自专注于安全的公司。

【讨论】:

【参考方案2】:

感谢 luboskrnac 和 Mark B。我尝试了 Java-jwt 和 jjwt 库,并在我的代码中使用了 jjwt。

@Test
public void tokenValidateTest() 
    String token = "exX0xXAi0iJKV1QiLCJhbGciOiJIUzI1NiJ9.eyXK2IjxxxJkIjp7InByb3ZpZGVyIjoicGFzc3dvcmQiLCJ1aWQiOiI5NDA2ZDc1Ny01ZjdmLTQ0MGMtYWRiMS05MmU4Y2U3N2QzYTBjKSwiaWF0IjoxNDYwMNYwODMzxQ.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    String secret = "6x3Ox29Xx1xxxXXiI0P3PL5pWdNUE5sPcXXXLxxxX";

    try 
        Claims claims = Jwts.parser().setSigningKey(secret.getBytes("UTF-8")).parseClaimsJws(token).getBody();

        Date issuedDate = claims.getIssuedAt();


        assert(issuedDate.before(new Date()));

     catch (Exception ex) 
        ex.printStackTrace();
    


【讨论】:

【参考方案3】:

是的,这是可能的。有很多库可以在 Java 中使用 JSON Web Tokens。这是一个例子:https://github.com/jwtk/jjwt

【讨论】:

【参考方案4】:

截至 20 年 11 月 21 日,我将使用 firebase-admin,这将是验证 jwt 的更简单方法

FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdToken(idToken);
String uid = decodedToken.getUid();

来源:https://firebase.google.com/docs/auth/admin/verify-id-tokens#java

【讨论】:

以上是关于是否可以从服务器(Java)验证 Firebase 令牌(JWT)的主要内容,如果未能解决你的问题,请参考以下文章

将电子邮件从身份验证列表发送给Firebase上的所有用户

我是否可以使用客户端登录中的Firebase ID令牌来使用Java SDK对Java桌面应用程序进行身份验证?

是否可以从 Firebase 获取可以映射到 Java 中多个子类的数据?

只允许从 Firebase 中的服务帐户写入?

是否需要验证mAuth?

我可以在 Cloud Functions Http Trigger 中的 Firebase 身份验证上创建用户吗?