springboot2.x之整合JWT篇

Java Nicholas 2019-03-18 561浏览
相关标签: JWT

1、JWT官网:https://jwt.io

image.png

用户认证流程:

image.png


2、JWT介绍

    JSON Web TOKEN(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于在各方之间作为JSON对象安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。JWTS可以使用秘密(使用HMAC算法)或公钥/私钥对使用RSA或ECDSA来签名。

    虽然JWTS可以加密,但也提供保密各方之间,我们将重点放在签名令牌。签名的令牌可以验证包含在其中的声明的完整性,而加密的令牌隐藏这些声明以防其他各方。当令牌使用公钥/私钥对签名时,签名也证明只有持有私钥的方才是签名的方。

 

    JWT由3个子字符串组成,分别为Header,Payload以及Signature,结合JWT的格式即:Header.Payload.Signature。(Claim是描述Json的信息的一个Json,将Claim转码之后生成Payload)。 


    2.1 头部信息(Header)

        头部信息包含 声明的类型 如:jwt 和声明的加密算法 一般使用HMAC SHA256

        JWT里验证和签名使用的算法,可选择下面的。

image.png


    2.2 载荷信息(Claim)

        存放我们的有效信息,包括标准信息和自定信息

        标准信息如下:

            "iss":"Issuer —— 用于说明该JWT是由谁签发的", 

            "sub":"Subject —— 用于说明该JWT面向的对象", 

            "aud":"Audience —— 用于说明该JWT发送给的用户", 

            "exp":"Expiration Time —— 数字类型,说明该JWT过期的时间", 

            "nbf":"Not Before —— 数字类型,说明在该时间之前JWT不能被接受与处理", 

            "iat":"Issued At —— 数字类型,说明该JWT何时被签发", 

            "jti":"JWT ID —— 说明标明JWT的唯一ID", 

            "user-definde1":"自定义属性举例", 

            "user-definde2":"自定义属性举例" 

   

        自定义数据:

        我们可以将一些不是很敏感的数据放入到载荷中 如下面的代码:

 String token = JWT.create().withClaim("userId", 123L)


    2.3 签名信息

        这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方          式进行加盐secret组合加密,然后就构成了jwt的第三部分。


3、JWT整合

    3.1 pom.xml

<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.8.0</version>
</dependency>


    3.2 创建token

public static final String SECRET = "WWW.QGSTU.COM";
public static final int EXPIRED_INTERVAL = 10;

public static String createToken(Long user_id) {
    Date iatDate = new Date();
    
    // expire time
    Calendar nowTime = Calendar.getInstance();
    nowTime.add(Calendar.DATE, EXPIRED_INTERVAL);
    Date expiresDate = nowTime.getTime();
    
    // 头部信息
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("alg", "HS256");
    map.put("typ", "JWT");
    
    String token = JWT.create()
        // header
        .withHeader(map)
        // payload
        .withIssuer("Mihuu Authorise")
        .withAudience("APP")
        .withSubject("subject")
        // sign time
        .withIssuedAt(iatDate)
        // expire time
        .withExpiresAt(expiresDate)
        // 自定义
        .withClaim("user_id", null == user_id ? null : user_id.toString())
        .withClaim("test", "my jwt token")
        .withClaim("isAdmin", true)
        // signature
        .sign(Algorithm.HMAC256(SECRET));
    return token;
}


    3.3 解密token,返回token信息

public static Map<String, Claim> verifyToken(String token) {
    DecodedJWT jwt = null;
    try {
        JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET))
            .withIssuer("Mihuu Authorise").build();
        jwt = verifier.verify(token);
    } catch (Exception e) {
        // token 校验失败, 抛出Token验证非法异常
    }
    return jwt.getClaims();
}


    3.4 执行事例

public static void main(String[] args) {
    String token = JWTUtils.createToken(100L);
    System.out.println("token: " + token);

    Map<String, Claim> claims = JWTUtils.verifyToken(token2);
    System.out.println("over...");
}


相关标签: JWT
相关文章
首先,明确两点: 1.http连接池不是万能的,过多的长连接会占用服务器资源,导致其他服务受阻 2.http连接池只适用于请求是经常访问同一主机(或同一个接口)的情况下 3.并发数不高的情况下资源利用率低下 那么,当你的业务符合上面3点,那么你可以考虑使用http连接池来提高服务器性能 使用http连接池的优点: 1.复用http连接,省去了tcp的3次握手和4次挥手的时间,极大降低请求响应的时间 2.自动管理tcp连接,不用人为地释放/创建连接 使用http连接池的大致流程 : 1.创建Poo继续阅读>>
2019-04-22 520浏览 4个赞
1、JWT官网:https://jwt.io 用户认证流程: 2、JWT介绍     JSON Web TOKEN(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于在各方之间作为JSON对象安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。JWTS可以使用秘密(使用HMAC算法)或公钥/私钥对使用RSA或ECDSA来签名。     虽然JWTS可以加密,但也提供保密各方之间继续阅读>>
2019-03-18 560浏览 3个赞
首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。 另外,说ThreadLocal使得各线程能够保持各自独立的一个对象,并不是通过ThreadLocal.set()来实现的,而是通过每个线程中的new 对象 的操作来创建的对象,每个线程创建一个,不是什么对象的拷贝或副本。通过ThreadLocal.set()将这个新创建继续阅读>>
2018-11-30 217浏览 0个赞
前言 《阿里巴巴 Java 开发手册》是阿里巴巴集团技术团队的集体经验总结,经历了多次大规模一线实战的检验及不断的完善,反馈给广大开发者。现代软件行业的高速发展对开发者的综合素质要求越来越高,因为不仅是编程知识点,其它维度的知识点也会影响到软件的最终交付质量。比如:数据库的表结构和索引设计缺陷可能带来软件上的架构缺陷或性能风险;工程结构混乱导致后续维护艰难;没有鉴权的漏洞代码易被黑客攻击等等。所以本手册以 Java 开发者为中心视角,划分为编程规约、异常日志、MySQL 数据库、工程结构、安全规继续阅读>>
2018-11-27 252浏览 0个赞
版权声明
本站的文章和资源来自互联网或者站长的原创。如果有侵犯版权的资源请尽快联系站长,我们会在24h内删除有争议的资源。