• Java后端登录(返回token)


    前言
    最近工作中需要等待前端进行联调和测试,互联网都知道,当到了联调和提测的时候,基本上的工作都是一阵一阵,中间是有很多空隙时间的,于是为了度过这些空隙时间,写几篇博客,记录一下


    处理思路大概是: 登录用户是否存在,不存在,则调用注册插入,存在则获取用户基本信息和token

    他的原理,我测试琢磨了一下,大致是这样
    1.将你输入的 账号、密码、生成时间、你的字符串(盐值-钥匙)、失效时间
    2.像我们平常生成md5一样,走了一个算法,算法的钥匙就是你的唯一字符串
    3.算法,将账号和密码与生成时间,通过字符串,进行加密,生成一批字符串,这个就是token

    当你要验证token的时候,他的原理大致就是这样
    1.你把token传过去,他通过你的钥匙字符串,解密,解密出来的东西是否符合他的规则【他会把解密的东西,变成一个含特定字段的json数据,如果不符合,那么就解密不出来json,就会报错,就是以json字符串这个特点,去做的规则判断】,不符合,则直接报错,解析错误,然后,获取了其中的时间,当然他也可以获取账号和密码,然后获取当前时间,与你的存储时间,相减,是否超过失效时间,如果是,则提示过期。

    理论上来说,我拿到了这个用户的token,我就能以token访问这个用户的任何服务,所以token才要设定过期时间。另外就算是过期token,不能在进行登录,但是token中的信息还是照样可以获取的。
    所以token中,不要学文中的测试案例,一样存敏感的信息(如密码等)

    这里我们采用jwt依赖生成token

            <dependency>
                <groupId>com.auth0</groupId>
                <artifactId>java-jwt</artifactId>
                <version>3.8.2</version>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    生成token

    package com.example.etf.story.service;
    
    import com.auth0.jwt.JWT;
    import com.auth0.jwt.JWTVerifier;
    import com.auth0.jwt.algorithms.Algorithm;
    import com.auth0.jwt.interfaces.Claim;
    import com.auth0.jwt.interfaces.DecodedJWT;
    
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;
    /**
     * @desc   使用token验证用户是否登录
     * @author zm
     **/
    public class TokenUtils {
        //设置过期时间
        private static final long EXPIRE_DATE=1000*60*5; //1分钟
        //token秘钥
        private static final String TOKEN_SECRET = "ZCfasfhuaUUHufguGuwu2020BQWf";
    
        public static String token (String username,String password){
    
            String token = "";
            try {
                //过期时间
                Date date = new Date(System.currentTimeMillis()+EXPIRE_DATE);
                //秘钥及加密算法
                Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
                //设置头部信息
                Map<String,Object> header = new HashMap<>();
                header.put("typ","JWT");
                header.put("alg","HS256");
                //携带username,password信息,生成签名
                token = JWT.create()
                        .withHeader(header)
                        .withClaim("username",username)
                        .withClaim("password",password).withExpiresAt(date)
                        .sign(algorithm);
    
            }catch (Exception e){
                e.printStackTrace();
                return  null;
            }
            return token;
        }
    
        public static boolean verify(String token){
            /**
             * @desc   验证token,通过返回true
             * @params [token]需要校验的串
             **/
            try {
                Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
                JWTVerifier verifier = JWT.require(algorithm).build();
    
                DecodedJWT jwt = verifier.verify(token);
                return true;
            }catch (Exception e){
                System.out.println("校验失败");
                return  false;
            }
        }
        public static void main(String[] args) {
            String username ="zhangsan";
            String password = "123";
            String token = token(username,password);
            System.out.println(token);
            boolean b = verify("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXNzd29yZCI6IjEyMyIsImV4cCI6MTY1NzA5ODE4MCwidXNlcm5hbWUiOiJ6aGFuZ3NhbiJ9.W-IgXJmNBrboXlzT_PtPkTavYhgRn9ZwkVpJoJLU6ks");
            Claim username1 = JWT.decode("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXNzd29yZCI6IjEyMyIsImV4cCI6MTY1NzA5ODE4MCwidXNlcm5hbWUiOiJ6aGFuZ3NhbiJ9.W-IgXJmNBrboXlzT_PtPkTavYhgRn9ZwkVpJoJLU6k1").getClaim("username");
            System.out.println("我是从token中获取的信息"+username1.asString());
    
            System.out.println(b);
        }
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
  • 相关阅读:
    top命令 – 实时显示系统运行状态
    Wpf知识小结
    一篇文章告诉你什么是Java内存模型
    CocosCreator使用物理引擎和回调
    vivado产生报告阅读分析6-时序报告2
    【C++】stack和queue
    运行huggingface Kosmos2报错 nameerror: name ‘kosmos2tokenizer‘ is not defined
    plink的文件格式
    Linux项目实训一
    AI 时代的向量数据库、关系型数据库与 Serverless 技术丨TiDB Hackathon 2023 随想
  • 原文地址:https://blog.csdn.net/qq_38403590/article/details/125598173