package objects
import (
"errors"
"time"
jwt "github.com/dgrijalva/jwt-go"
)
type JWT struct {
secretKey []byte
refreshKey []byte
tokenExpire time.Duration
}
func NewJWT(secretKey, refreshKey string, tokenExpire time.Duration) *JWT {
return &JWT{
secretKey: []byte(secretKey),
refreshKey: []byte(refreshKey),
tokenExpire: tokenExpire,
}
}
type Claims struct {
UserID int64 `json:"userid"`
jwt.StandardClaims
}
func (j *JWT) GenerateToken(userID int64) (string, error) {
// Create the Claims
claims := Claims{
UserID: userID,
StandardClaims: jwt.StandardClaims{
ExpiresAt: time.Now().Add(j.tokenExpire).Unix(),
Issuer: "my_app",
},
}
// Create the token
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
// Sign the token with the secret key
tokenString, err := token.SignedString(j.secretKey)
if err != nil {
return "", err
}
return tokenString, nil
}
func (j *JWT) GenerateRefreshToken() (string, error) {
// Create the Claims
claims := jwt.StandardClaims{
ExpiresAt: time.Now().Add(24 * time.Hour).Unix(), // Refresh token will expire after 1 day
Issuer: "my_app",
}
// Create the token
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
// Sign the token with the refresh key
refreshTokenString, err := token.SignedString(j.refreshKey)
if err != nil {
return "", err
}
return refreshTokenString, nil
}
func (j *JWT) ValidateToken(tokenString string) (int64, error) {
// Parse the token
token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) {
return j.secretKey, nil
})
if err != nil {
if err == jwt.ErrSignatureInvalid {
return 0, errors.New("invalid token signature")
}
return 0, err
}
// Check if the token is valid
claims, ok := token.Claims.(*Claims)
if !ok || !token.Valid {
return 0, errors.New("invalid token claims")
}
return claims.UserID, nil
}
func (j *JWT) ParseToken(tokenString string) (*Claims, error) {
// Parse the token
token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) {
return j.secretKey, nil
})
if err != nil {
if err == jwt.ErrSignatureInvalid {
return nil, errors.New("invalid token signature")
}
return nil, err
}
// Check if the token is valid
claims, ok := token.Claims.(*Claims)
if !ok || !token.Valid {
return nil, errors.New("invalid token claims")
}
return claims, nil
}
田猿笔记
- 粉丝: 4022
- 资源: 38
最新资源
- 钓鱼邮件的概要介绍与分析
- mysql的概要介绍与分析
- docker的概要介绍与分析
- 图吧工具箱202405版本绿色安装包
- 基于python无人艇轨迹预测系统检查 框架html + css + jquery + python + django + orm + pytorch
- (全新整理)1980-2023年中国就业数据2.0(全国、省、地级市)
- 基于springboot的家具销售电商平台lw+ppt
- C++编程实验:几何计算与基本算术运算方法实现及应用
- 音乐播放器源码+可执行程序+测试音乐+截图 快速实现一个音乐播放器,功能如下: 1,播放本地音乐文件 2,有播放、暂停、下一曲、上一曲功能,显示歌曲列表信息 3,显示播放时间进度 4,拖
- 【回退N帧ARQ】模拟代码及报告
- 谭浩强-C程序设计(第五版)PPT-源码-习题答案-习题库
- 基于springboot的教师人事档案管理系统lw+ppt
- win32汇编环境,怎么进行加法运算的
- QT 下拉菜单设置参数 起始端口和结束端口
- 数据仓库与数据挖掘-魏伟一
- (全新整理)2010-2023年中国省级新质生产力水平:数据+dofile+结果
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈