JWT创建token鉴权

        开发程序需要设计用户鉴权,这次跟桌面客户端交互,采用token进行鉴权,使用JWT进行鉴权(虽然有人说不要用JWT了,不过还是试试了解一下。)


开发时参考了其他博主的内容学习了解,下面JWT的相关知识内容就直接复制过来,出处:JWT全面解读、使用步骤_陈袁的博客-CSDN博客


JWT基本使用

在pom.xml引入java-jwt

<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.4.1</version>
</dependency>

写一个JWT工具类,包含根据信息生成token字符串,解密验证token,读取token中的userId。因为过期时间参数和签名方法都是静态的,所以配置文件设置的时间参数用set方法注入才能生效。

@Component
@Slf4j
public class JwtUtil {

    private static long EXPIRE_TIME;
//    private static final long EXPIRE_TIME = 30 * 60 *1000;

    private static final String TOKEN_SECRET = "da0362fda20d424cac8843617fd62166";

    public static String sign(String userName,Integer userId){
        Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
        Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
        Map<String,Object> header = new HashMap<>(2);
        header.put("typ","JWT");
        header.put("alg","HS256");
        return JWT.create().withHeader(header).withClaim("userNmae",userName)
                .withClaim("userId",userId).withExpiresAt(date).sign(algorithm);
    }

    /**
     * 解密Token
     *
     * @param token
     * @return
     * @throws Exception
     */
    public static Map<String, Claim> verifyToken(String token) {
        DecodedJWT jwt = null;
        try {
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(TOKEN_SECRET)).build();
            jwt = verifier.verify(token);
        } catch (Exception e) {
             e.printStackTrace();
             log.error("解密token报错",e);
            // token 校验失败, 抛出Token验证非法异常
        }
        return jwt.getClaims();
    }



    public static Integer getUserId(String token){
        DecodedJWT jwt = JWT.decode(token);
        Claim userIdClaim = jwt.getClaim("userId");
        return userIdClaim.asInt();
    }

    @Value("${jwt.expireTime}")
    public void setExpireTime(long expireTime){
        JwtUtil.EXPIRE_TIME = expireTime;
    }
}

JWT消息构成

一个token分3部分,按顺序为

  1. 头部(header)
  2. 其为载荷(payload)
  3. 签证(signature) 

由三部分生成token 
3部分之间用“.”号做分隔。例如eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c 
验证koten地址

头部


Jwt的头部承载两部分信息:

声明类型,这里是jwt
声明加密的算法 通常直接使用 HMAC SHA256 
JWT里验证和签名使用的算法,可选择下面的。

JWS    算法名称 描述
HS256    HMAC256    HMAC with SHA-256
HS384    HMAC384    HMAC with SHA-384
HS512    HMAC512    HMAC with SHA-512
RS256    RSA256    RSASSA-PKCS1-v1_5 with SHA-256
RS384    RSA384    RSASSA-PKCS1-v1_5 with SHA-384
RS512    RSA512    RSASSA-PKCS1-v1_5 with SHA-512
ES256    ECDSA256    ECDSA with curve P-256 and SHA-256
ES384    ECDSA384    ECDSA with curve P-384 and SHA-384
ES512    ECDSA512    ECDSA with curve P-521 and SHA-512


使用代码如下

// header Map
Map<String, Object> map = new HashMap<>();
map.put("alg", "HS256");
map.put("typ", "JWT");


playload


载荷就是存放有效信息的地方。基本上填2种类型数据

-标准中注册的声明的数据 
-自定义数据 
由这2部分内部做base64加密。最张数据进入JWT的chaims里存放。

标准中注册的声明 (建议但不强制使用)

iss: jwt签发者

sub: jwt所面向的用户

aud: 接收jwt的一方

exp: jwt的过期时间,这个过期时间必须要大于签发时间

nbf: 定义在什么时间之前,该jwt都是不可用的.

iat: jwt的签发时间 jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

使用方法

 JWT.create().withHeader(map) // header
                .withClaim("iss", "Service") // payload
                .withClaim("aud", "APP")
                .withIssuedAt(iatDate) // sign time
                .withExpiresAt(expiresDate) // expire time


自定义数据

这个就比较简单,存放我们想放在token中存放的key-value值 
使用方法

 JWT.create().withHeader(map) // header
                .withClaim("name", "cy") // payload
                .withClaim("user_id", "11222");


签名signature

jwt的第三部分是一个签证信息,这个签证信息算法如下: 
base64UrlEncode(header) + "." + base64UrlEncode(payload)+your-256-bit-secret 
这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

基本上至此,JWT的API相关知识已经学完了,但是API不够有好,不停的用withClaim放数据。不够友好。下面推荐一款框架,相当于对JWT的实现框架
 


使用JwtUtil的sign方法生成token字符串,我选择的是将token放在response的header中,token的签名信息包括userId和用户名,加密秘钥TOKEN_SECRET使用UUID生成。token生成后,向客户端返回用户信息之前在redis里也存储了token。

客户端获取后也将token放在request的header中发送请求,拦截器鉴权时从request中获取携带的token进行解密校验。同时获取userId并对redis存储的token进行鉴权。

因为懒没有设计活跃用户刷新token时间,采用的固定到期时间鉴权。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JWT(JSON Web Token)是一种用于在网络应用间传递信息的安全方式,通常用于身份验证和授权。生成JWT token的过程需要进行编码操作。 JWT token的编码一般使用Base64编码算法进行转换。Base64是一种将字节数据转换成可打印ASCII字符的编码方式,常用于在网络上传输二进制数据。 生成JWT token的过程首先需要构建一个包含指定信息(如用户身份、权限、过期时间等)的JSON对象。然后将该JSON对象进行Base64编码,生成一个字符串。接着,在编码后的字符串前添加一个算法和密钥等信息,以确保token的安全性。最后,将编码后的字符串和添加了额外信息的字符串进行拼接,生成最终的JWT token。 在实际应用中,可以使用各种编程语言或框架提供的JWT库来方便地生成JWT token。这些库一般提供了简单易用的API,可以根据传入的参数自动生成符合规范的JWT token。 总的来说,JWT token的生成过程包括构建JSON对象、Base64编码和拼接信息等步骤。通过使用相关编程语言或框架提供的JWT库,可以简化JWT token的生成过程,提高开发效率。 ### 回答2: JWT(JSON Web Token)是一种用于在用户和服务器之间传递安全可靠的身份验证和授权信息的令牌标准。JWT由三部分组成:Header、Payload和Signature。 生成JWT Token的过程包括以下几个步骤: 1. 创建JWT的Header,Header是一个JSON对象,包含算法和令牌类型。常用的算法包括HMAC和RSA。例如:{"alg":"HS256","typ":"JWT"}。 2. 创建JWT的Payload,Payload也是一个JSON对象,用于存储具体的用户信息和其他需要传递的数据。例如:{"sub":"user123","exp":1619988777},其中sub表示用户ID,exp表示过期时间。 3. 对Header和Payload进行Base64编码,得到两个字符串。 4. 将编码后的Header和Payload使用.连接起来,形成一个字符串。 5. 使用密钥对这个字符串进行签名,生成Signature。Signature的生成算法根据Header指定的算法来确定。例如,如果指定的算法是HMAC-SHA256,将使用密钥对字符串进行HMAC-SHA256签名。 6. 将签名得到的字符串与Header和Payload用.连接起来,就得到了最终的JWT Token。 生成的JWT Token可以用于身份验证和授权,可以在HTTP请求的Authorization头部以Bearer方式发送给服务器进行鉴权验证。服务器可以通过解密JWT Token的Signature,并根据Payload中的相关信息判断是否合法和有效。 总之,JWT Token的在线编码生成可以通过创建Header和Payload,对其进行Base64编码,使用密钥生成Signature,最后将它们组合在一起生成最终的JWT Token

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值