jwt的简单使用
简介
使用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的简单使用的更多相关文章
- .NetCore WebApi——基于JWT的简单身份认证与授权(Swagger)
上接:.NetCore WebApi——Swagger简单配置 任何项目都有权限这一关键部分.比如我们有许多接口.有的接口允许任何人访问,另有一些接口需要认证身份之后才可以访问:以保证重要数据不会泄露 ...
- spring-security-结合JWT的简单demo
spring-security-demo 前言:本来是想尽量简单简单点的写一个demo的,但是spring-security实在是内容有点多,写着写着看起来就没那么简单了,想入门spring-secu ...
- Django restframework之Token验证的缺陷及jwt的简单使用
一.主要缺陷: 1.Token验证是放在一张表中,即authtoken_token中,key没有失效时间,永久有效,一旦泄露,后果不可想象,安全性极差. 2.不利于分布式部署或多个系统使用一套验证,a ...
- session,cookie,jwt的简单使用
cookie的使用 https://blog.csdn.net/qq_58168493/article/details/122492358 session的使用 https://blog.csdn.n ...
- .NetCore WebApi——Swagger简单配置
在前后端分离的大环境下,API接口文档成为了前后端交流的一个重点.Swagger让开发人员摆脱了写接口文档的痛苦. 官方网址:https://swagger.io/ 在.Net Core WebApi ...
- Django+JWT实现Token认证
对外提供API不用django rest framework(DRF)就是旁门左道吗? 基于Token的鉴权机制越来越多的用在了项目中,尤其是对于纯后端只对外提供API没有web页面的项目,例如我们通 ...
- JWT验证
理解 JSON Web Token(JWT) 验证 JSON Web Token认证的操作指南 在本文中,我们将了解JSON Web Token的全部内容. 我们将从JWT的基本概念开始,然后查看其结 ...
- 【aspnetcore】配置使用jwt验证
因为害怕token泄露出现问题,所以从未在项目中使用jwt.但这玩意现在真的很火,趁有空还是研究了一下. 在aspnetcore中实现jwt很简单,感觉微软把很多工作都做了,虽然开发效率上去了,但是使 ...
- Node.js 使用 express-jwt 解析 JWT
Node.js 上 Token 鉴权常用的是 passport,它可以自定义校验策略,但如果你是用 express 框架,又只是解析 JWT 这种简单需求,可以尝试下 express-jwt 这个中间 ...
随机推荐
- OpenInstall实现APP无邀请码推广
1.登录OpenInstall网站,这里会为你创建一个AppKey,而这个东西在web页面会用到. 2.在推广页面中加入推广下载. <script type="text/javascr ...
- nginx之旅(第三篇):代理、正向代理、反向代理、代理的原理、nginx反向代理场景、nginx反向代理配置、nginx反向代理语法
一.代理服务与反向代理 什么是代理服务 代理-代理办理(代理理财.代理收货.代理购物等等). 一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术.关于正向代理的概念如下: 正向代理(forw ...
- JMETER 使用JDBC查找数据作为参数
有些情况下我们需要读取平台中的用户作为参数,比如用户ID作为参数进行压力测试,我们可以使用CSV文件,如果这样做,需要每一次 都构造文件,比较麻烦.如果可以查询数据库,将查出的数据作为参数循环传入的话 ...
- 将qemu使用的设备树dump出来
像下面的qemu启动命令: sudo qemu-system-aarch64 \ -M virt \ -cpu cortex-a53 \ -smp \ -m 4096M \ -kernel ./lin ...
- IE float 双边距
IE 浮动元素的双边距
- mysql 之编码配置、引擎介绍、字段操作、数据类型及约束条件
数据库的配置 # 通过配置文件统一配置的目的: 统一管理 服务端(mysqld) 客户端(client) 配置了mysqld(服务端)的编码为utf8, 那么再创建的数据库,默认编码都采用utf8. ...
- 解决——》java.lang.IllegalArgumentException: Body parameter 0 was null
1.操作2.现象(错误信息)3.原因错误代码:4.解决1)方案一:@RequestBody(required=false)2)方案二:传参数时限制authSession不能为空ody paramete ...
- Taro,实现小程序在样式文件中导入背景图片
https://taro-docs.jd.com/taro/docs/static-reference.html 注意点是,控制你的图片大小,然后配置完limit后,把dist删掉,重新运行 npm ...
- LeetCode 885. Spiral Matrix III
原题链接在这里:https://leetcode.com/problems/spiral-matrix-iii/ 题目: On a 2 dimensional grid with R rows and ...
- 【线段树】【P5522】[yLOI2019] 棠梨煎雪
C [yLOI2019] 棠梨煎雪 Background 岁岁花藻檐下共将棠梨煎雪 自总角至你我某日辗转天边 天淡天青 宿雨沾襟 一年一会信笺却只见寥寥数言 --银临<棠梨煎雪> Desc ...