首页 > 其他分享 >JWT

JWT

时间:2022-09-26 14:59:42浏览次数:66  
标签:return String JWT jwt key payload

  官网:https://jwt.io/

  JWT是标准化的token,全称为 Json Web Token,是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准(RFC 7519)

  从本质上讲JWT也是一种token,只不过JWT是被大家广泛接受的标准    

  JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息

 

  JWT组成:

    JWT由 header、payload、signature 三部分组成,它们之间用圆点(.)连接。如:xxxxxx.yyyyyy.zzzzzz

    header:头部,承载了两部分信息,①:声明类型,这里是 jwt  ②:声明加密的算法,通常使用HMACSHA256

    payload:载荷,即存放有效信息的地方,即请求数据

    signature:签名信息,这个签证信息由三部分组成:header (base64后的);payload (base64后的);secret

 

    如一个JWT token解码后的结果:

    

  JWT使用原理:

  

 

 

  使用:

    一般是在请求头里加入Authorization,并加上Bearer标注:

  headers: {
    'Authorization': 'Bearer ' + token
  }

  

  依赖:

<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>4.0.0</version>
</dependency>

  JwtUtil:

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.exceptions.SignatureVerificationException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * JWT工具类
 *
 * @author yangyongjie
 * @date 2022/8/19
 */
public class JwtUtil {

    private static final Logger LOGGER = LoggerFactory.getLogger(JwtUtil.class);

    private JwtUtil() {
    }

    /**
     * 创建HS256(HmacSHA256) JWT Token
     *
     * @param headers 头信息
     * @param payload 荷载信息
     * @param key     HS256(HmacSHA256)密钥
     * @param expires 有效期,单位毫秒
     * @return JWT Token
     */
    public static String createToken(Map<String, Object> headers, Map<String, Object> payload, String key, long expires) {
        Algorithm algorithm = Algorithm.HMAC256(key);
        return JWT.create()
                .withHeader(headers)
                .withPayload(payload)
                .withExpiresAt(new Date(System.currentTimeMillis() + expires))
                .sign(algorithm);
    }

    /**
     * 创建HS256(HmacSHA256) JWT Token(默认头),默认有效期1小时
     *
     * @param payload 荷载信息
     * @param key     HS256(HmacSHA256)密钥
     * @return
     */
    public static String createToken(Map<String, Object> payload, String key) {
        return createToken(null, payload, key, 60 * 60 * 1000L);
    }

    /**
     * 创建HS256(HmacSHA256) JWT Token(默认头)
     *
     * @param payload 荷载信息
     * @param key     HS256(HmacSHA256)密钥
     * @param expires 有效期,单位毫秒
     * @return
     */
    public static String createToken(Map<String, Object> payload, String key, long expires) {
        return createToken(null, payload, key, expires);
    }

    /**
     * 验证JWT Token有效性
     * 默认会与当前时间比较,若到期时间小于当前时间,则认为失效
     *
     * @param jwtToken JWT Token
     * @param key      HS256(HmacSHA256)密钥
     * @return 是否有效
     */
    public static boolean verifyToken(String jwtToken, String key) {
        Algorithm algorithm = Algorithm.HMAC256(key);
        JWTVerifier verifier = JWT.require(algorithm)
                .build();
        try {
            verifier.verify(jwtToken);
        } catch (TokenExpiredException tee) {
            LOGGER.error("token失效" + tee.getMessage(), tee);
            return false;
        } catch (SignatureVerificationException sve) {
            LOGGER.error("token无效" + sve.getMessage(), sve);
            return false;
        } catch (JWTVerificationException jve) {
            LOGGER.error("token校验异常" + jve.getMessage(), jve);
            return false;
        }
        return true;
    }

    /**
     * 解析jwt token 获取payload
     *
     * @param jwtToken
     * @return
     */
    public static String parseToken(String jwtToken) {
        try {
            DecodedJWT jwt = JWT.decode(jwtToken);
            String payload = jwt.getPayload();
            return payload;
        } catch (Exception e) {
            LOGGER.error("token解析异常" + e.getMessage(), e);
            return null;
        }
    }


    public static void main(String[] args) throws InterruptedException {
        Map<String, Object> payload = new HashMap<String, Object>();
        payload.put("partnerId", "12344");
        String key = "yangyongjie";
        String jwtToken = JwtUtil.createToken(payload, key);
        System.out.println(jwtToken);

        boolean flag = JwtUtil.verifyToken(jwtToken, "123");
        System.out.println(flag);

    }

}

 

 

 

附录:

  https://harttle.land/2015/08/10/cookie-session.html

  JWT PDF:https://assets.ctfassets.net/2ntc334xpx65/o5J4X472PQUI4ai6cAcqg/13a2611de03b2c8edbd09c3ca14ae86b/jwt-handbook-v0_14_1.pdf

 

 

END.

标签:return,String,JWT,jwt,key,payload
From: https://www.cnblogs.com/yangyongjie/p/16730934.html

相关文章

  • JWT:拥有我,即拥有权力
     Hi,这里是桑小榆。 上篇文章中,我们一起探讨了OAuth协议的原理以及授权认证流程,本次我们一起探讨jwt令牌作为授权协议的传输介质。OAuth协议规范了几个参与角色的......
  • jwt验证原理
    一、jwt原理服务器认证以后,签名生成一个JSON对象,发回给用户;之后,用户与服务端通信的时候,都要发回这个JSON对象。服务器就不保存任何session数据了,也就是说,服务器变......
  • Asp.Net Core鉴权授权:JWT基本使用
    实现用户登录功能的经典做法是用Session,但是在前后端分离、分布式环境下已经不适应了,而现在我们倾向于采用JWT代替Session实现登录。JWT全称是JSONwebtoken,它是使用JSON......
  • 微服务系列之授权认证(三) JWT
    1.JWT简介官方定义:JWT是JSONWebToken的缩写,JSONWebToken是一个开放标准(RFC7519),它定义了一种紧凑的、自包含的方式,可以将各方之间的信息作为JSON对象安全地传......
  • JWT authentication: Best practices and when to use it
    Editor'snote:ThisJWTauthenticationtutorialwaslastupdatedon1July2021.Itmaystillcontaininformationthatisoutofdate.InthisJWTauthenticat......
  • 理解Jwt代码
    1.昨天主要是对Jwt的代码里面不熟悉的代码进行了简要的理解,发现其实有些流程并不是普通程序员自己写的,而是自己进行拓展,这些流程是开源程序员写的开发流程;我发现这些代码一......
  • Session认证机制与JWT认证机制
    一、什么是身份认证?身份认证(Authentication)又称“身份验证”、“鉴权”,是指通过一定的手段,完成对用户身份的确认。日常生活中的身份认证随处可见,例如:高铁的验票乘车,手......
  • JWT -
    参考资料1、官方网站:https://jwt.io/JWT介绍JWT的本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWTtoken,并且这个JWTtoken......
  • 基于koa模块和socket.io模块搭建的node服务器实现通过jwt 验证来渲染列表、私聊、群聊
    1.具体代码在需要的下载https://gitee.com/zyqwasd/socket      效果: 2.package.json文件1.下载基本的模块 修改了start脚本 nodemon需要先单独......
  • Flask 学习-31.flask_jwt_extended 验证token四种方headers/cookies/json/query_stri
    前言用户携带授权token访问时,其jwt的所处位置列表,默认是在请求头部headers中验证。可以通过JWT_TOKEN_LOCATION进行全局配置,设置token是在请求头部,还是cookies,还是json,......