如何生成以及校验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;
        }
    }
}
相关文章
|
前端开发 数据安全/隐私保护
前端传给后端的token是哪里来的?
前端传给后端的token是哪里来的?
1908 0
|
弹性计算 前端开发 小程序
微信小程序上传文件至阿里云OSS直传(java后端签名+前端直传)
当前的通用文件上传方式是通过前端上传到服务器,再由服务器转存至对象存储。这种方式在处理小文件时效率尚可,但大文件上传因受限于服务器带宽,速度较慢。例如,一个100MB的文件在5Mbps带宽的阿里云ECS上上传至服务器需160秒。为解决此问题,可以采用后端签名的方式,使微信小程序直接上传文件到阿里云OSS,绕过服务器中转。具体操作包括在JAVA后端引入相关依赖,生成签名,并在微信小程序前端使用这个签名进行文件上传,注意设置正确的请求头和formData参数。这样能提高大文件上传的速度。
4240 1
|
3月前
|
关系型数据库 MySQL 数据库
用 Python 实现 MySQL 数据库定时自动备份
本文介绍如何用Python脚本实现MySQL数据库的自动化备份。通过调用`mysqldump`工具,结合时间戳命名、文件压缩与定时任务(如crontab),可轻松实现“无人值守”备份。涵盖配置修改、安全建议及日志管理,提升备份效率与可靠性,适用于日常开发与生产环境。
117 0
|
存储 安全 JavaScript
手摸手带你进行XSS攻击与防御
当谈到网络安全和信息安全时,跨站脚本攻击(XSS)是一个不可忽视的威胁。现在大家使用邮箱进行用户认证比较多,如果黑客利用XSS攻陷了用户的邮箱,拿到了cookie那么就可以冒充你进行收发邮件,那真就太可怕了,通过邮箱验证进行其他各种网站的登录与高危操作。 那么今天,本文将带大家深入了解XSS攻击与对应的防御措施。
|
JSON Java Maven
关于使用Java-JWT的笔记
这篇文章介绍了使用Java-JWT库来生成和验证JSON Web Tokens (JWT) 的方法。文中解释了JWT的组成,包括头部、载荷和签名,并提供了如何使用java-jwt库生成和验证token的示例代码。此外,还提供了Maven依赖和一些关于token的标准声明和自定义声明的解释。
关于使用Java-JWT的笔记
|
Java Spring
【Spring配置】创建yml文件和properties或yml文件没有绿叶
本文主要针对,一个项目中怎么创建yml和properties两种不同文件,进行配置,和启动类没有绿叶标识进行解决。
|
API
查手机号归属地免费API接口教程
此API用于查询指定手机号码的归属地信息,包括号段、省份、城市、运营商等。支持POST和GET请求方式,需提供用户ID、KEY及手机号作为参数。返回结果包含状态码、信息提示及详细归属地信息。示例请求地址:https://cn.apihz.cn/api/ip/shouji.php?id=88888888&key=88888888&phone=13219931963。
2834 5
VScode使用element-ui插件准备
VScode使用element-ui插件准备
2495 1
VScode使用element-ui插件准备
|
JSON 算法 Java
微服务Token鉴权设计的几种方案
【8月更文挑战第18天】在微服务架构中,Token鉴权是确保服务安全性的重要环节。本文将详细介绍几种常见的微服务Token鉴权设计方案,旨在帮助大家在工作和学习中更好地理解和应用这些技术。
929 2
|
存储 JSON Prometheus
SpringBoot动态修改日志级别
SpringBoot动态修改日志级别
1200 0
SpringBoot动态修改日志级别

热门文章

最新文章