JWT-登录Token解决方案

一、Token解析

1、生成Token

使用一个字符串+失效时间进行生成Token

    private static final String secret = "1234567";

    public static String createToken(String subject){

        String token = Jwts.builder().setSubject(subject)
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60))
                .signWith(SignatureAlgorithm.HS256, secret)
                .compact();

        return token;
    }


    public static void main(String[] args) throws InterruptedException {
        String name = "你好!JWT";

        String token = createToken(name);
        System.out.println("token:"+token);
     //eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiLkvaDlpb3vvIFKV1QiLCJleHAiOjE2NTE1MDcwNDh9.xSasY3wAUF3ng4G-2tqr4iTzAwgM_xUeBuJfZ15dsKw

    }

2、Token解析

JWT生成的Token包含三部分,用小数点隔开:

第一部分采用Base64编码:header信息,记录算法信息

JWT-登录Token解决方案_第1张图片

第二部分采用Base64编码:载荷信息,我这里主要是对字符串名和失效时间进行编码

JWT-登录Token解决方案_第2张图片

第三部分签名信息,取第一部分和第二部分联合本地存储的secret进行签名。

JWT-登录Token解决方案_第3张图片

二、Token续期

上面例子,Token时效性为1小时。当超时,Token失效,用户需要再次登录。

如此会影响用户体验度,以下便引出Token续期的需求。

1、每天第一次登录,续期Token。

        记录当前用户从当天第一次登录开始,到0点Token失效。

2、每次操作请求,就进行续期Token。

        用户第一登录完成后,后续如果再次请求操作,就生成新的Token,旧Token删除。

3、access_token、refresh_token续期

        用户第一次登录完成后,返回access_token和refresh_token两个Token,refresh_token的时效比access_token长些(具体长多少,根据实际业务场景设计)。例如:access_token设计时效为1小时,refresh_token设置为2小时。当access_token超时时效,此时再去校验refresh_token,如果refresh_token还在有效期,则重新生成access_token,用户无需重新登录;如果refresh_token也失效,则需要用户重新登录。

4、新老Token共存

        用户第一次登录完成后,生成access_token,如果用户在access_token有效期内再次请求,则生成新的access_token,次种方式跟第二个方案比较相似,只是不需要删除旧Token。直到旧Token超时自己失效。

你可能感兴趣的:(项目方案,restful,后端,安全)