首页 > 其他分享 >JWT

JWT

时间:2023-09-08 21:38:19浏览次数:61  
标签:return JWT checkResult token claims public


1.介绍

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

实现是 一个 加密的字符串 ,这个字符串存储了用户的身份凭证 等信息

什么是jwt?

JSON Web Token (JWT)是一个开放的行业标准(RFC 7519),它定义了一种简洁的、自包含的协议格式,用于在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任。JWT可以使用HMAC算法或使用RSA的公钥/私钥对进行签名,防止被篡改。

JWT官网: https://jwt.io

JWT令牌的优点:

  • JWT基于json,非常方便解析。
  • 可以在令牌中自定义丰富的内容,易扩展。
  • 通过非对称加密算法及数字签名技术,JWT防止篡改,安全性高。
  • 资源服务使用JWT可不依赖认证服务即完成授权。

JWT令牌的缺点:

  • JWT令牌较长,占存储空间比较大。

jwt 组成

一个JWT实际上就一个字符串,它由三部分组成,头部、负载与签名。

2.快速开始

2.1添加依赖

<!-- JWT -->
		<dependency>
			<groupId>com.auth0</groupId>
			<artifactId>java-jwt</artifactId>
			<version>3.2.0</version>
		</dependency>
		<dependency>
			<groupId>io.jsonwebtoken</groupId>
			<artifactId>jjwt</artifactId>
			<version>0.7.0</version>
		</dependency>

2.2创建工具类

package com.qf.eduonline.utils;

import com.qf.eduonline.common.CheckResult;
import com.qf.eduonline.constant.SystemConstant;
import io.jsonwebtoken.*;
import org.bouncycastle.util.encoders.Base64;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.SignatureException;
import java.util.Date;

/**
 * 前端发送认证请求   比如用户名密码   认证通过后  后台生成一个 token
 * 发送给前端  前端存储到 localstorage    以后每次请求 都带这个token  发送到后台 去验证
 *
 *
 *
 * @date 2021/5/9 20:44
 */
public class JwtUtils {

    /**
     * 签发JWT
     * @param id
     * @param subject 可以是JSON数据 尽可能少
     * @param ttlMillis
     * @return
     */
    public static String createJWT(String id, String subject, long ttlMillis) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        SecretKey secretKey = generalKey();
        JwtBuilder builder = Jwts.builder()
                .setId(id)
                .setSubject(subject)   // 主体  一般是用户名
                .setIssuer("glls")     // 签发者
                .setIssuedAt(now)      // 签发时间
                .signWith(signatureAlgorithm, secretKey); // 签名算法以及密匙
        if (ttlMillis >= 0) {
            long expMillis = nowMillis + ttlMillis;  // 当前时间  + 有效时间
            Date expDate = new Date(expMillis);   // 过期时间
            builder.setExpiration(expDate); // 设置过期时间
        }
        return builder.compact();
    }

    /**
     * 验证JWT
     * @param jwtStr
     * @return
     */
    public static CheckResult validateJWT(String jwtStr) {
        CheckResult checkResult = new CheckResult();
        Claims claims = null;
        try {
            claims = parseJWT(jwtStr);
            checkResult.setSuccess(true);
            checkResult.setClaims(claims);
        } catch (ExpiredJwtException e) {
            checkResult.setErrCode(SystemConstant.JWT_ERRCODE_EXPIRE);
            checkResult.setSuccess(false);
        } catch (SignatureException e) {
            checkResult.setErrCode(SystemConstant.JWT_ERRCODE_FAIL);
            checkResult.setSuccess(false);
        } catch (Exception e) {
            checkResult.setErrCode(SystemConstant.JWT_ERRCODE_FAIL);
            checkResult.setSuccess(false);
        }
        return checkResult;
    }

    /**
     * 生成加密Key
     * @return
     */
    public static SecretKey generalKey() {
        byte[] encodedKey = Base64.decode(SystemConstant.JWT_SECERT);
        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
        return key;
    }


    /**
     * 解析JWT字符串
     * @param jwt
     * @return
     * @throws Exception
     */
    public static Claims parseJWT(String jwt) throws Exception {
        SecretKey secretKey = generalKey();
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(jwt)
                .getBody();
    }

    public static void main(String[] args) throws InterruptedException {
         // 后端生成token
        String sc=createJWT("1","jack",SystemConstant.JWT_TTL);
        System.out.println(sc);

        // 后端验证token
        CheckResult checkResult = validateJWT(sc);
        System.out.println(checkResult.isSuccess());
        System.out.println(checkResult.getErrCode());
        Claims claims=checkResult.getClaims();
        System.out.println(claims);
        System.out.println(claims.getId());
        System.out.println(claims.getSubject());

        // 刷新token 重新生成token
        Claims claims2=validateJWT(sc).getClaims();
        String sc2=createJWT(claims2.getId(),claims2.getSubject(),SystemConstant.JWT_TTL);
        System.out.println(sc2);
    }

}

配套 常量类 和 结果类

package com.qf.eduonline.constant;

/**
 * @ClassName : SystemConstant
 * @Author : glls
 * @Date: 2021/5/9 20:30
 * @Description :
 */
public class SystemConstant {
    /**
     * token
     */
    public static final int JWT_ERRCODE_NULL = 4000;			//Token不存在
    public static final int JWT_ERRCODE_EXPIRE = 4001;			//Token过期
    public static final int JWT_ERRCODE_FAIL = 4002;			//验证不通过

    /**
     * JWT
     */
    public static final String JWT_SECERT = "8677df7fc3a34e26a61c034d5ec8245d";			//密匙
    public static final long JWT_TTL = 60 * 60 * 1000;									//token有效时间
}
package com.qf.eduonline.common;


import io.jsonwebtoken.Claims;

public class CheckResult {

    private int errCode;

    private boolean success;

    private Claims claims;

    public int getErrCode() {
        return errCode;
    }

    public void setErrCode(int errCode) {
        this.errCode = errCode;
    }

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public Claims getClaims() {
        return claims;
    }

    public void setClaims(Claims claims) {
        this.claims = claims;
    }

}

3.认证成功 发送token

@PostMapping("/login")
    public JsonResult login(@RequestBody User user){
        User currentUser = userService.login(user);
        if(currentUser==null){
            //认证失败
            return JsonResult.ok(currentUser);
        }else {
            //认证成功  向前端 发送token
            String token =   JwtUtils.createJWT(String.valueOf(currentUser.getUserId()),currentUser.getRealname(), SystemConstant.JWT_TTL);
            return JsonResult.ok(token);
        }
    }

4.前端接受token 并存起来 以后每次请求在请求头上携带token

//整合  jwt  返回的是  token     后面的请求  就需要携带token
               var token  = resp.data.data;
				//把响应结果的token 存到 localStorage
               window.localStorage.setItem("token",token);

后续请求携带token

let token = window.localStorage.getItem("token");
        
        this.axios.defaults.headers.common["token"] = token;  // 请求头上带token

标签:return,JWT,checkResult,token,claims,public
From: https://blog.51cto.com/u_16254019/7412473

相关文章

  • jwt介绍和构成
    一、jwt介绍和构成1、jwt:JsonWebToken:web方向的token认证方案#做会话保持的发展历史 -https://www.cnblogs.com/liuqingzheng/p/8990027.html#jwt:JsonWebToken:web方向的token认证方案#在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证(token......
  • 接口文档,jwt介绍和构成,jwt签发与认证,base64编码,drf-jwt使用,django-rest-framewor
    1接口文档#作为后端,接口写好了#作为前端,需要使用我们写的接口(移动端,web,桌面端)#后端需要写接口文档#接口文档的展现形式: 1word,md,写好传到公司的某个平台---》前端可以下载2自动生成接口文档---》后端通过配置--》把所写的接口都自动生成---》地址--》访问......
  • drf-jwt使用
    一、jwt介绍和构成1.介绍jwt:JsonWebToken,Web方向的Token认证方案在用户注册或登录之后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证(token串)。我们不再使用session认证机制,而使用JsonWebToken(本质就是token)认证机制。JsonWebToken:JWT用在我们前后端......
  • 接口文档、jwt
    接口文档作为后端,接口写好了作为前端,需要使用我们写的接口(移动端、web、桌面端)后端需要写接口文档接口文档的展现形式:1、word,md,写好传到公司的某个平台,前端可以下载2、自动生成接口文档,后端通过配置,把所写的接口都自动生成,一个地址访问这个地址就能看到所有接口文档......
  • jwt和token的区别
    (目录)jwt和token的区别两者区别Token和JWT(JSONWebToken)是两种常见的身份验证机制,它们有以下区别:格式Token是一个字符串,通常包含了用户的身份信息和其他相关信息,例如用户ID、过期时间等。而JWT是一种特定的Token格式,它使用JSON对象来存储这些信息,并使用Base64编码进行传输......
  • GIN 接入JWT
    GIN,JWT下载地址github地址:https://github.com/golang-jwt/jwt文档地址:https://pkg.go.dev/github.com/golang-jwt/jwt下载:gogetgithub.com/golang-jwt/jwtpackagemainimport("github.com/gin-gonic/gin""github.com/golang-jwt/jwt""net/ht......
  • JwtToken
    JwtToken的使用和介绍什么是JSONWebToken?​ JSONWeb令牌(JWT)是一种开放标准(RFC7519),它定义了一种紧凑且独立的方式,用于在各方之间以JSON对象的形式安全地传输信息。此信息可以验证和信任,因为它是经过数字签名的。JWT可以使用密钥(使用HMAC算法)或使用RSA或ECDSA......
  • 基于jwt的token验证
    一、什么是JWTJsonwebtoken(JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源......
  • 在GIn框架中使用JWT
    在gin框架中使用JWT JWT全称JSONWebToken是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下。什么是JWT?JWT全称JSONWebToken是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多......
  • JWT
    什么是JWT:JWT(JSONWebToken)是目前最流行的跨域认证解决方案,是一种基于Token的认证授权机制。从JWT的全称可以看出,JWT本身也是Token,一种规范化之后的JSON结构的Token。JWT自身包含了身份验证所需要的所有信息,因此,我们的服务器不需要存储Session信息。这显然增加......