基于JWT 的 单点登录 SSO Token 的生成与验证

JWT 简介

JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。

jwt 的官方地址:

http://www.mvnjar.com/com.auth0/java-jwt/3.2.0/detail.html

下载最新的 jar 包:java-jwt-3.2.0.jar

JWT的组成
一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷(Playload)与签名。

示例代码:

package test;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTCreationException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT; 
 
import java.io.UnsupportedEncodingException;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
 
public class TokenUtilJWT {
 
    //公共密钥客户端不会知道
    public static String SECRET="FreeMaNong";
 
    public static String createToken() {
        //签名发布时间
        Date iatDate=new Date();
        System.out.println(iatDate);//英文时间
 
        //设置签名过期时间  1分钟
        Calendar nowTime=Calendar.getInstance();
        nowTime.add(Calendar.MINUTE,1);
        Date expiresDate=nowTime.getTime();
        //System.out.println(expiresDate);
 
        Map map=new HashMap();
        map.put("alg","HS256");//设置算法 为HS256
        map.put("typ","JWT");//设置类型为JWT
        String token = "";
		try {
			token = JWT.create().withHeader(map)
			        .withClaim("name","Free码农")
			        .withClaim("age","28")
			        .withClaim("org","今日头条")
			        .withClaim("username","chenyu")
			        .withIssuedAt(iatDate)  //设置签发时间
			        .withExpiresAt(expiresDate)  //设置过期时间 过期时间大于签发时间
			        .sign(Algorithm.HMAC256(SECRET));//用公共密钥加密
		       System.out.println("----------- 生成Token --------- createToken() ");
		       System.out.println(token);
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (JWTCreationException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}  
       return token;
    }
 
    public static Map verifyToken(String token) {
    	System.out.println("-------- -- 验证Token --------- verifyToken()");
        JWTVerifier verifier = null;
        DecodedJWT jwt=null;
		try {
			//用公共密钥解密验证
			verifier = JWT.require(Algorithm.HMAC256(SECRET)).build(); 
            jwt = verifier.verify(token);
        }catch (IllegalArgumentException e1) {
			e1.printStackTrace();
		} catch (UnsupportedEncodingException e1) {
			e1.printStackTrace();
		}catch (Exception e){
            throw new RuntimeException("登录凭证已过去,请重新登录");
        }
        return jwt.getClaims();
    }
 
    public static void main(String[] args) {
    	String token = createToken();
        //System.out.println("Token:"+token);
        Map claims=verifyToken(token);
        System.out.println(claims.get("name").asString());
        System.out.println(claims.get("age").asString());
        System.out.println(claims.get("username").asString());
        System.out.println(claims.get("org")==null?null:claims.get("org").asString());
        
        //测试过期token
        //String GuoQiToken="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhdXRoMCJ9.izVguZPRsBQ5Rqw6dhMvcIwy8_9lQnrO3vpxGwPCuzs";
        //Map claims2=verifyToken(GuoQiToken);
    }
    
}

运行结果:

Thu Sep 13 10:37:37 CST 2018
----------- 生成Token --------- createToken() 
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvcmciOiLku4rml6XlpLTmnaEiLCJuYW1lIjoiRnJlZeeggeWGnCIsImV4cCI6MTUzNjgwNjMxNywiaWF0IjoxNTM2ODA2MjU3LCJhZ2UiOiIyOCIsInVzZXJuYW1lIjoiY2hlbnl1In0.TR3xxlkXdUuVviIX8Ad_UJGJCKTARBTtnzjkax6rgp4
-------- -- 验证Token --------- verifyToken()
Free码农
28
chenyu
今日头条

运行可能会报错:

1、

Caused by:

java.lang.ClassNotFoundException: com.fasterxml.jackson.core.JsonProcessingException

 

2、

Caused by:

java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.JsonSerializer

 

3、

Caused by:

java.lang.ClassNotFoundException: com.fasterxml.jackson.annotation.JsonView

 

4、

java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString([B)Ljava/lang/String;

at com.auth0.jwt.JWTCreator.sign(JWTCreator.java:330)

at com.auth0.jwt.JWTCreator.access$100(JWTCreator.java:24)

at com.auth0.jwt.JWTCreator$Builder.sign(JWTCreator.java:311)

 

解决:

加入以下三个jar包就好了:

jackson-core-2.7.0.jar、jackson-databind-2.7.0.jar、jackson-annotations-2.7.0.jar  

第4个异常是因为jar版本太低了,把

commons-codec-1.2.jar 换成 commons-codec-1.6.jar 高一些的版本就好了。

所用 jar包下载参考链接: https://download.csdn.net/download/xuanjiewu/10662531

 

 

你可能感兴趣的:(Java)