简介

使用jwt对数据进行存储加密,分为java和golang版本。


java版本

  • maven配置

    <dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.4.0</version>
    </dependency>
  • 工具类 JWTUtil.java

    import com.auth0.jwt.JWT;
    import com.auth0.jwt.JWTVerifier;
    import com.auth0.jwt.algorithms.Algorithm;
    import com.auth0.jwt.interfaces.DecodedJWT;
    import lombok.Getter;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component; import java.util.Date; public class JWTUtil { private final static String ISS = "dust"; private final static String SECRET = "secret"; // 过期时间是3600秒,既是1个小时
    private final static long EXPIRATION = 3600; /**
    * 生成token
    * @param userId 用户id
    * @return token
    */
    public static String createToken(long userId){
    Algorithm algorithm = Algorithm.HMAC384(SECRET);
    String token = JWT.create()
    .withIssuer(ISS).withIssuedAt(new Date()).withExpiresAt(new Date(System.currentTimeMillis() + EXPIRATION * 1000))
    .withClaim("USER_ID",userId)
    .sign(algorithm); return token;
    } /**
    * 解析token
    * @param token token
    * @return long
    */
    public static long analyzeToken(String token){
    DecodedJWT decode = JWT.decode(token);
    return decode.getClaim("USER_ID").asLong();
    } /**
    * 校验token的合法性
    * @param token token
    * @return boolean
    */
    public static boolean verifyToken(String token){
    Algorithm algorithm = Algorithm.HMAC384(SECRET);
    JWTVerifier verifier = JWT.require(algorithm)
    .withIssuer(ISS)
    .build(); //Reusable verifier instance
    try {
    // 验证不通过会出现异常
    verifier.verify(token);
    } catch(Exception ex){
    return false;
    }
    return true;
    } }
  • 测试 JWTTests.java

    import org.junit.Test;
    public class JWTTests {
    @Test
    public void createTokenTest(){
    String token = JwtUtil.createToken(12345678);
    System.out.println(token); // eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJpc3MiOiJkdXN0IiwiVVNFUl9JRCI6MTIzNDU2Nzh9.qUNgiHKB5uIWhhpf8GM6hdcaE9hTvDJG9UmmMpcCPpfncduQ713aKI7VMhCedJWP
    } @Test
    public void decodeTokenTest(){
    String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJpc3MiOiJkdXN0IiwiVVNFUl9JRCI6MTIzNDU2Nzh9.qUNgiHKB5uIWhhpf8GM6hdcaE9hTvDJG9UmmMpcCPpfncduQ713aKI7VMhCedJWP";
    System.out.println(JwtUtil.analyzeToken(token)); // 12345678
    } @Test
    public void verifyTokenTest(){
    String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJpc3MiOiJkdXN0IiwiVVNFUl9JRCI6MTIzNDU2Nzh9.qUNgiHKB5uIWhhpf8GM6hdcaE9hTvDJG9UmmMpcCPpfncduQ713aKI7VMhCedJWP";
    System.out.println(JwtUtil.verifyToken(token)); // true
    }
    }

golang版本

  • 导入包

    go get -u github.com/dgrijalva/jwt-
  • JWTUtil.go

    package testcase
    
    import (
    "errors"
    "log"
    "time"
    "github.com/dgrijalva/jwt-go"
    ) type JWT struct {
    SigningKey []byte
    }
    var (
    TokenExpired error = errors.New("Token is expired")
    TokenNotValidYet error = errors.New("Token not active yet")
    TokenMalformed error = errors.New("That's not even a token")
    TokenInvalid error = errors.New("Couldn't handle this token:")
    SignKey string = "dust"
    )
    type CustomClaims struct {
    ID int64 `json:"id"`
    jwt.StandardClaims
    }
    func NewJWT() *JWT {
    return &JWT{
    []byte(GetSignKey()),
    }
    }
    func GetSignKey() string {
    return SignKey
    }
    func SetSignKey(key string) string {
    SignKey = key
    return SignKey
    }
    func (j *JWT) CreateToken(claims CustomClaims) (string, error) {
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    return token.SignedString(j.SigningKey)
    }
    func (j *JWT) ParseToken(tokenString string) (*CustomClaims, error) {
    token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) {
    return j.SigningKey, nil
    })
    if err != nil {
    if ve, ok := err.(*jwt.ValidationError); ok {
    if ve.Errors&jwt.ValidationErrorMalformed != 0 {
    return nil, TokenMalformed
    } else if ve.Errors&jwt.ValidationErrorExpired != 0 {
    // Token is expired
    return nil, TokenExpired
    } else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 {
    return nil, TokenNotValidYet
    } else {
    return nil, TokenInvalid
    }
    }
    }
    if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid {
    return claims, nil
    }
    return nil, TokenInvalid
    } func (j *JWT) RefreshToken(tokenString string) (string, error) {
    jwt.TimeFunc = func() time.Time {
    return time.Unix(0, 0)
    }
    token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) {
    return j.SigningKey, nil
    })
    if err != nil {
    return "", err
    }
    if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid {
    jwt.TimeFunc = time.Now
    claims.StandardClaims.ExpiresAt = time.Now().Add(1 * time.Hour).Unix()
    return j.CreateToken(*claims)
    }
    return "", TokenInvalid
    } // 生成令牌
    func GenerateToken(id int64) (token string, err error) {
    j := NewJWT()
    claims := CustomClaims{
    id,
    jwt.StandardClaims{
    //NotBefore: int64(time.Now().Unix() - 1000), // 签名生效时间
    ExpiresAt: int64(time.Now().Unix() + 1*60), // 过期时间 一小时
    Issuer: "dust", //签名的发行者
    },
    } if token, err = j.CreateToken(claims); err != nil {
    log.Printf( "j.CreateToken(claims) err:%s", err.Error())
    return
    } return token, nil
    }
  • 测试JWTUtil_test.go

    package testcase
    
    import (
    "testing"
    "time"
    ) func TestGenerateToken(t *testing.T) {
    var (
    token string
    err error
    ) if token, err = GenerateToken(123456); err != nil {
    t.Fatalf("GenerateToken错误,错误信息:%s", err.Error())
    }
    t.Logf("token 值:%s", token)
    } func TestParseToken(t *testing.T) {
    var (
    err error
    claims *CustomClaims
    )
    token := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MjM0NTY3LCJleHAiOjE1NjI4MTAyNTIsImlzcyI6ImR1c3QifQ.OxY2F0mOX8Y8XhMPHcgxmXENyHAwg_i9eCWqokIw0QE"
    jwt := NewJWT()
    if claims, err = jwt.ParseToken(token); err != nil {
    t.Fatalf("ParseToken错误,错误信息:%s", err.Error())
    }
    t.Logf("claims中ID 值:%d", claims.ID)
    } func TestRefreshToken(t *testing.T) {
    var (
    err error
    newToken string
    )
    //token := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTIzNDU2LCJleHAiOjE1NjI3NTA3NzcsImlzcyI6ImR1c3QiLCJuYmYiOjE1NjI3NDk3MTd9.W-qTms5UeuBRtF6VfksaZeZANZWfP5NdFHwYPGDMp98"
    jwt := NewJWT()
    createToken, _ := GenerateToken(234567)
    time.Sleep(62 * time.Second)
    if _, err = jwt.ParseToken(createToken); err != nil && err == TokenExpired {
    if newToken,err = jwt.RefreshToken(createToken); err == nil {
    t.Logf("newToken 值:%s", newToken)
    } else {
    t.Fatalf("RefreshToken错误,错误信息:%s", err.Error())
    }
    }
    }

jwt的简单使用的更多相关文章

  1. .NetCore WebApi——基于JWT的简单身份认证与授权(Swagger)

    上接:.NetCore WebApi——Swagger简单配置 任何项目都有权限这一关键部分.比如我们有许多接口.有的接口允许任何人访问,另有一些接口需要认证身份之后才可以访问:以保证重要数据不会泄露 ...

  2. spring-security-结合JWT的简单demo

    spring-security-demo 前言:本来是想尽量简单简单点的写一个demo的,但是spring-security实在是内容有点多,写着写着看起来就没那么简单了,想入门spring-secu ...

  3. Django restframework之Token验证的缺陷及jwt的简单使用

    一.主要缺陷: 1.Token验证是放在一张表中,即authtoken_token中,key没有失效时间,永久有效,一旦泄露,后果不可想象,安全性极差. 2.不利于分布式部署或多个系统使用一套验证,a ...

  4. session,cookie,jwt的简单使用

    cookie的使用 https://blog.csdn.net/qq_58168493/article/details/122492358 session的使用 https://blog.csdn.n ...

  5. .NetCore WebApi——Swagger简单配置

    在前后端分离的大环境下,API接口文档成为了前后端交流的一个重点.Swagger让开发人员摆脱了写接口文档的痛苦. 官方网址:https://swagger.io/ 在.Net Core WebApi ...

  6. Django+JWT实现Token认证

    对外提供API不用django rest framework(DRF)就是旁门左道吗? 基于Token的鉴权机制越来越多的用在了项目中,尤其是对于纯后端只对外提供API没有web页面的项目,例如我们通 ...

  7. JWT验证

    理解 JSON Web Token(JWT) 验证 JSON Web Token认证的操作指南 在本文中,我们将了解JSON Web Token的全部内容. 我们将从JWT的基本概念开始,然后查看其结 ...

  8. 【aspnetcore】配置使用jwt验证

    因为害怕token泄露出现问题,所以从未在项目中使用jwt.但这玩意现在真的很火,趁有空还是研究了一下. 在aspnetcore中实现jwt很简单,感觉微软把很多工作都做了,虽然开发效率上去了,但是使 ...

  9. Node.js 使用 express-jwt 解析 JWT

    Node.js 上 Token 鉴权常用的是 passport,它可以自定义校验策略,但如果你是用 express 框架,又只是解析 JWT 这种简单需求,可以尝试下 express-jwt 这个中间 ...

随机推荐

  1. (原)在anaconda3+ubuntu16.04中编译Pose flow中的deepmatching动态库

    转载请注明出处: https://www.cnblogs.com/darkknightzh/p/11285239.html 参考网址: https://github.com/YuliangXiu/Po ...

  2. Linux小知识:CentOS使用Google-BBR加速网络

    准备一台centos的服务器查看系统内核:rpm -qa | grep kernel这里需要Linux内核在4.9 RC版本以上,如果版本不是请继续下面操作 访问https://elrepo.org/ ...

  3. MySQL 上亿大表优化实践

    目录 背景 分析 select xxx_record语句 delete xxx_record语句 测试 实施 索引优化后 delete大表优化为小批量删除 总结 背景 XX实例(一主一从)xxx告警中 ...

  4. 团队第五次作业:alpha2成绩汇总

    一.作业题目 团队第五次作业:alpha2发布 二.作业评分标准 博客评分规则(总分100)博客要求 给出开头和团队成员列表(10') 给出发布地址以及安装手册(20') 给出测试报告(40') 给出 ...

  5. springmvc多环境配置-profiles

    1 pom.xml 添加 profiles 标签 <profiles> <!--pro 线上环境--> <profile> <id>hdapp_pro& ...

  6. Spring AOP技术本质认识

    Spring AOP技术本质认识 一.AOP简介   AOP(Aspect Oriented Programming,面向切面编程),把某一类问题集中在一个地方进行处理,比如处理程序中的点击事件.打印 ...

  7. CSS布局对齐的小技巧

    类似以上这种对齐怎么做? 很简单,上面是的污水开始的位置是由于被"能源种类"顶着,下面没有字怎么办?最差的办法就是用margin-left,因为在不同的机器上,可能会出现兼容性问题 ...

  8. 剑指offer15 二进制中1的个数

    题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1.因此,如果输入9则函数输出2. int Number(int n) { ; while ...

  9. C# Cef winform 脚本的执行 踩过的坑

    先从后端代码 如何执行js 代码谈起; 一个简单的需求: 在winform上点击一个按钮,实现登录信息的填入 流程: 就是让C#去运行一段脚本,. 运行的方式有两种, 异步与同步, 因为CEF是一帧一 ...

  10. 深入js系列-语法

    语法 语句和表达式 我们用英语的术语来说明它们的区别 "句子"(sentence)是完整表达某个意思的一组词,由一个或多个"短语"(phrase)组成,它们之间 ...