JWT跨域认证解决登录注册

存储用户登陆状态方案:

方案1:session存储。

  • 缺点:服务器集群,session数据不能共享(因为session是保存在JVM中)。

  • 缺点:无法实现跨域请求。A项目和B项目,现在要求用户只要在其中一个项目登录,再访问另一个项目就会自动登录,实现跨域请求的认证。

  • 缺点:耗费服务器内存

方案2:JWT

另一种方案是JVM索性不保存 session 数据了,所有数据都保存在客户端或保存到一个公共的存储介质,JWT 就是这种方案的一个代表。

JWT介绍

JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。是用于对应用程序上的用户进行身份验证的标记。也就是说,使用 JWT 的应用程序不再需要保存有关其用户的 cookie 或其他session数据。此特性便于可伸缩性,同时保证应用程序的安全。

在身份验证过程中, 当用户使用其凭据成功登录时, 将返回 JSON Web token。

每当用户要访问受保护的资源时,需要在请求头中携带 JWT。后端服务器接收到带有 JWT 的请求时,首先要做的是验证token。

JWT格式

  • JWT就是一个字符串,经过加密处理与校验处理的字符串,形式为:A.B.C

  • A由JWT头部信息header加密得到

  • B由JWT用到的身份验证信息json数据加密得到

  • C由A和B加密得到,是校验部分

JWT使用

1、导入依赖:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
</dependency>

测试类:

/**
 * jwt单元测试
 */
public class JwtTest {

    @Test
    public void testJwt(){
        // 1.定义加密内容
        Map<String, Object> map = new HashMap<>();
        map.put("id",  1);
        map.put("mobile", "12345678901");

        // 2.定义加密密钥
        String secret = "XXX";

        // 3.生成jwt字符串
        String token = Jwts.builder()
                .setClaims(map)
                .signWith(SignatureAlgorithm.HS256, secret)
                .compact();

        System.out.println("生成token:" + token);

        // 4.解析token,获取map集合
        Map<String, Object> body = (Map<String, Object>)
                Jwts.parser().setSigningKey(secret).parse(token).getBody();

        System.out.println("body内容:" + body);
    }
}

2、抽取JWT工具类:

public class JwtUtils {
//参数1、id 参数2、手机号码 参数3、加密的密匙
    public static String createToken(Long id, String phone, String secret) {
        // 定义要加密的数据
        Map<String,Object> map = new HashMap<>();
        map.put("id", id);
        map.put("phone", phone);

        // 生成token并返回
        return Jwts.builder()
                .setClaims(map) // 声明加密的数据
                .signWith(SignatureAlgorithm.HS256, secret) // 指定加密算法与密钥
                .compact();
    }
}

3、yml 配置密钥

secret: XXX # 密钥

4、类中使用通过@Value注解加上yml配置密匙全路径获取-密钥

 // 获取密钥
    @Value("${XXX}")
    private String secret;


        // 【使用抽取的JWT工具类生成token、存储token到redis中】
        String token = JwtUtils.createToken(user.getId(), phone, secret);
        // 【往token中存储的应该是整个用户对象数据,所以这里需要把对象转换为json字符串存储】
        String tokenData = JSON.toJSONString(user);
        // 【生成的token作为key,用户数据作为value,存储到redis中,并设置过期时间】
        redisTemplate.opsForValue().set(TOKEN_KEY + token, tokenData, Duration.ofHours(4));

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值