Token的生成和检验

Posted Androidc_CY

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Token的生成和检验相关的知识,希望对你有一定的参考价值。

package TestToken;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.junit.Test;

import java.io.UnsupportedEncodingException;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class TokenTest {

    //公共密钥客户端不会知道
    public static String SECRET="FreeMaNong";

    public static  String  createToken() throws UnsupportedEncodingException {
        //签名发布时间
        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<String,Object> map=new HashMap<String, Object>();
        map.put("alg","HS256");//设置算法 为HS256
        map.put("typ","JWT");//设置类型为JWT
        String 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);
       return token;
    }

    public static Map<String,Claim> verifyToken(String token) throws UnsupportedEncodingException {
        JWTVerifier verifier =JWT.require(Algorithm.HMAC256(SECRET)).build();//用公共密钥解密验证
        DecodedJWT jwt=null;
        try{
            jwt=verifier.verify(token);
        }catch (Exception e)
        {
            throw new RuntimeException("登录凭证已过去,请重新登录");
        }
        return jwt.getClaims();
    }


    @Test
    public void TestToken() throws UnsupportedEncodingException {
        String token=createToken();
        System.out.println("Token:"+token);
        Map<String,Claim> 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<String,Claim> claims2=verifyToken(GuoQiToken);
    }



    @Test
    public void Test() throws UnsupportedEncodingException {
        Algorithm algorithm = Algorithm.HMAC256("secret");
        String token = JWT.create().withIssuer("auth0") .sign(algorithm);
        System.out.println(token);
    }
}

  

以上是关于Token的生成和检验的主要内容,如果未能解决你的问题,请参考以下文章

两段检验系统生成的identityHashCode是否重复的代码

Laravel:如何在控制器的几种方法中重用代码片段

add application window with unknown token XXX Unable to add window;is your activity is running?(代码片段

add application window with unknown token XXX Unable to add window;is your activity is running?(代码片段

Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段

go 微服务中的token的生成和验证