使用Java实现Auth0 JWT认证

4
我使用了这个库Auth0 Java JWT来实现我的REST API的JSON Web Tokens,该API使用了Spring Framework。

以下是代码:

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就是安全的吗?我应该使用过期日期吗?


定义“安全”。即,您试图保护哪种威胁模型? - Oliver Charlesworth
这将是一个公共应用程序,因此可能的威胁是人们能够基于电子邮件地址(该地址对某些用户是公开的)生成令牌。如果我必须重新表述问题,我会说:“我使用的库是否正确,SHA256是否不可破解?” - Elbbard
令牌加密只适用于那些知道秘钥的人。您的头部和正文将使用base64进行加密,并且可以非常容易地解密。Jwt不是加密数据的方法,它是创建一些基于头部+正文+秘密密钥的签名以进行验证。 - rolyanos
2个回答

1

是和否!你的代码看起来没问题!

JWT是将加密内容放在客户端电脑上(如cookies),然后它就是您API的凭证。(我们通常在OAuth中使用jwt)

您可以确保客户端电脑中的数据未被修改。然后,它是小型分布式会话管理的绝佳选择。

我应该使用过期日期吗?

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

它安全吗?!

安全有限制,其中一个重要限制是时间。每个密码都是可破解的,但在其时间内。最好定期更改您的秘密。

尽管您的代码似乎很安全,但黑客可以利用许多其他情况侵入您的系统并获取您的秘密。您还应该注意它们。您代码的所有部分,包括您的系统,必须具有可接受的安全级别。 记住:

强链只能取决于最弱的环节。


0
简单来说,就是“不安全”。因为JWT不能传递安全数据。基本上,JWT用于保护您提供给其他人或通过信道提供给其他人的数据不被篡改。您会给他们一个带有签名的数据。当他们返回您提供的数据时,您可以通过该签名检查您的数据是否被篡改过。另一方面,您提供的数据是公开的,任何人都可以通过Base64解码器查看您的负载数据。因此,您根本不应该通过JWT传递明文密码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接