使用 Java 的 Auth0 JWT

Posted

技术标签:

【中文标题】使用 Java 的 Auth0 JWT【英文标题】:Auth0 JWT with Java 【发布时间】:2017-11-22 05:48:54 【问题描述】:

我使用这个库 Aut0 Java JWT 为我使用 Spring 框架的 REST API 实现了 JSON Web 令牌。

这里是代码

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTCreationException;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.io.UnsupportedEncodingException;

public class JWTutils 
    private final static String secret = "fj32Jfv02Mq33g0f8ioDkw";

    public static String createToken(String email)
    
        try 
            return JWT.create()
                    .withIssuer("auth0")
                    .withClaim("email", email)
                    .sign(Algorithm.HMAC256(secret));
         catch (JWTCreationException exception)
            throw new RuntimeException("You need to enable Algorithm.HMAC256");
         catch (UnsupportedEncodingException e) 
            throw new RuntimeException(e.getMessage());
        
    

    public static String getEmailInToken(String token)
    
        try 
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secret))
                    .withIssuer("auth0")
                    .build();
            DecodedJWT jwt = verifier.verify(token);
            return jwt.getClaim("email").asString();
         catch (JWTDecodeException exception)
            return null;
         catch (UnsupportedEncodingException e) 
            return null;
        
    

只要我使用 HTTPS,我的 JWT 就安全吗?我应该使用到期日期吗?

【问题讨论】:

定义“安全”。即,您试图保护哪种威胁模型? 这将是一个公共应用程序,因此可能的威胁是人们能够根据电子邮件地址(某些用户公开)生成令牌。如果我必须重新提出问题,我会说“我对库的使用是否正确,SHA256 是否牢不可破?” 令牌加密只适用于知道密钥的人。您的标头和正文将使用 base64 加密,并且可以很容易地解密。 Jwt 不是加密数据的方法,它是基于 header + body + secret_key 创建一些签名进行验证 【参考方案1】:

Yes & No!,您的代码似乎没问题!

JWT 就是把加密的东西(比如cookies)放到客户端的电脑里,然后它就是你的api的ticket。(我们通常在OAuth中使用jwt)

您可以确保您在客户计算机中的数据没有被修改。那么它是小型分布式会话管理的绝佳选择。

我应该使用到期日期吗?

是的,特别是对于会话管理。您不希望一个用户永远登录,也许另一个用户能够窃取他的会话。这个令牌现在是他的用户名和密码。小心这个!

安全吗?!

安全有限制,一个重要的就是时间。每个密码都是可以破解的,但有时间限制。你最好不时更改你的密码。

虽然您的代码似乎是安全的,但在许多其他情况下,黑客可以侵入您的系统并获取您的秘密。您也应该了解它们。包括系统在内的代码的所有部分都必须具有可接受的安全级别。 记住:

链条的强度取决于其最薄弱的环节

【讨论】:

以上是关于使用 Java 的 Auth0 JWT的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Java 项目中导入 com.auth0.jwt

ClassNotFoundException:com.auth0.jwt.algorithms.Algorithm

ClassNotFoundException: com.auth0.jwt.exceptions.JWTCreationException 与 DocuSignApi Java SDK

有没有办法在同一个项目中同时使用 auth0-spring-security-api 和 java-jwt?

如何生成用于 com.auth0 java-jwt 的 RSA 密钥?

JWT-JAVA简单测试用例