如何生成以及校验token

简介: 如何生成以及校验token

1.What is token?        

token是令牌的意思,作用就像“通关令牌”一样,持有token的请求会被“放行”,不持有token的请求可以被拦截(可以设置白名单使不被拦截,例如登陆请求)。

token是由服务端创建的一串字符串,登陆成功后发送给前端存储在浏览器或本地中,以后每次发送请求都携带上。


1. 使用拦截器在请求发出前在请求头中添加上 token。

2. 将 token 存储在浏览器的 cookies 中,符合一些条件每次请求都会自动带上 token。

2.Why do we use token?

在前后端分离的web项目中,HTTP是无状态协议,即使使用账号密码登陆,后端仍然无法分辨是谁发出的请求,要么后端不需要确认请求者的身份,要么每次请求都携带身份信息供后端确认。


显然第一种方法对软件的安全会造成极大的威胁,那么第二种方法就被改善成了token,token就是加密了的用户身份信息。

3.token组成(Composition of token)

jwt(java web token)为例,下图介绍了详细介绍了token的组成。

4.校验token(Verify token)

这里只说最基础的校验。


token的加密一般是可逆的,后端接收到token中,还可以根据加密的算法再进行解密,以获取荷载中的用户信息,因此荷载中不能放置密码等信息。


第三部分由于加入了自己制定的秘钥(秘钥一般保存在后端代码中),解密成功后会与前两部分和保存的秘钥进行对比,对比成功了才算token验证通过。经过这样的双重保障,这三部分每一部分被篡改都会被发现。


校验流程:

5. 实操:生成token(Generate token)

以生成jwt为例子,代码如下:

        <!-- 引入jwt -->
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.8.2</version>
        </dependency>
@Slf4j
public class JwtUtil {
    /**
     * 使用固定的解密秘钥
     */
    private static final String SECRET = TOKEN_SECRET;
    /**
     * @version: V1.0
     * @description: 生成token并验证token并解密token中的信息
     * @param:  userInfo 用户手机号和用户Id
     * @return: java.lang.String 返回token
     **/
    public static String getToken(UserInfoEntity userInfo) {
        try{
            //用秘钥生成签名
            Algorithm algorithm = Algorithm.HMAC256(SECRET);
            //默认头部+载荷(手机号/id)+签名=jwt
            String jwtToken= JWT.create()
                    .withClaim("userPhone", userInfo.getUserPhone())
                    .withClaim("userId", userInfo.getUserId())
                    .sign(algorithm);
            log.info("用户{}的token生成成功:{}",userInfo.getUserId(),jwtToken);
            return jwtToken;
        }catch (Exception e){
            log.error("用户{}的token生成异常:{}",userInfo.getUserId(),e);
            return null;
        }
    }
    /**
     * @version: V1.0
     * @description: 校验token是否正确
     * @param:  token
     * @param: userPhone
     * @return: UserInfoEntity token中的用户信息(姓名/id)
     **/
    public static UserInfoEntity verify(String token) {
        try {
            // 根据用户信息userInfo生成JWT效验器
            Algorithm algorithm = Algorithm.HMAC256(SECRET);
            JWTVerifier verifier = JWT.require(algorithm)
                    .build();
            // 效验TOKEN
            verifier.verify(token);
            log.info("token:{}校验成功成功",token);
            //返回token内容
            return getTokenInfo(token);
        } catch (Exception exception) {
            log.error("token校验异常:{}",exception);
            return null;
        }
    }
    /**
     * @version: V1.0
     * @Title: getUsername
     * @description: 从Token中解密获得Token中的用户信息
     * @param:  token
     * @return: UserInfoEntity token中的用户信息(姓名/id)
     **/
    private static UserInfoEntity getTokenInfo(String token) {
        try {
            DecodedJWT jwt = JWT.decode(token);
            UserInfoEntity userInfo=new UserInfoEntity();
            userInfo.setUserPhone(jwt.getClaim("userPhone").asString());
            userInfo.setUserId(jwt.getClaim("userId").asString());
            log.info("用户{}从token获取用户信息成功",userInfo.getUserId());
            return userInfo;
        } catch (JWTDecodeException e) {
            log.error("从token:{}获取用户信息异常:{}",token,e);
            return null;
        }
    }
}
目录
打赏
0
0
0
0
5
分享
相关文章
Token验证失败
Token验证失败 微信 微信公众平台开发 Token校验失败 URL Token原文 http://www.cnblogs.com/txw1958/p/token-verify.html    Token验证失败的解决方法   一、问题由来 在使用URL和Token启用微信公众平台开发模式消息接口的时候,我们会碰到下面三种情况  1. token校验失败 这样回头检查一下各项配置是否正确。
2567 0
JWT令牌生成与校验
JWT令牌生成与校验
445 0
JWT和Security 登录权限判断和token访问和让token失效
JWT和Security 登录权限判断和token访问和让token失效
JWT令牌如何将令牌token转换为登录者的信息的?
java项目的权限认证系统大家都熟悉,之前本人也用到过几种认证token的方式,其中JWT是我觉得最神秘的一种,因为我一直没搞明白,在认证完成后,访问业务接口时,接口是怎么把请求头中的token转换为接口中的用户信息的,直到HandlerMethodArgumentResolver这个接口进入我的视野。
270 0
JWT进行请求头校验
JWT进行请求头校验
118 0
JWT如何解析过期的token中的信息
JWT如何解析过期的token中的信息
1642 0
JWT如何解析过期的token中的信息
使用token机制实现接口幂等性校验
为需要保证幂等性的每一次请求创建一个唯一标识token, 先获取token, 并将此token存入redis, 请求接口时, 将此token放到header或者作为请求参数请求接口, 后端接口判断redis中是否存在此token: 如果存在, 正常处理业务逻辑, 并从redis中删除此token, 那么, 如果是重复请求, 由于token已被删除, 则不能通过校验, 返回请勿重复操作提示, 如果不存在, 说明参数不合法或者是重复请求, 返回提示即可。
789 0
使用token机制实现接口幂等性校验
koa如何进行token设置和进行token过期验证
两个参数分别是签名算法和自定义的签名Key(盐)。签名key可以byte[] 、String及Key的形式传入。前两种形式均存入builder的keyBytes属性,后一种形式存入builder的key属性。如果是第二种(及String类型)的key,则将其进行base64解码获得byte[] 。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等