feat(auth): 添加JWT与Casbin权限认证功能
This commit is contained in:
1 parent
fe86c081f4
commit
16a9f64109
9 files changed
+236
-27
No files matched your search
@@ -0,0 +1,90 @@
|
||||
package jwts
|
||||
|
||||
import (
|
||||
"EnGin/internal/global"
|
||||
"errors"
|
||||
"time"
|
||||
|
||||
"github.com/golang-jwt/jwt/v5"
|
||||
)
|
||||
|
||||
type Claims struct {
|
||||
UserID uint `json:"user_id"`
|
||||
Roles []uint `json:"roles"`
|
||||
Nickname string `json:"nickname"`
|
||||
Avatar string `json:"avatar"`
|
||||
Email string `json:"email"`
|
||||
}
|
||||
|
||||
type RefreshClaims struct {
|
||||
UserID uint `json:"user_id"`
|
||||
jwt.RegisteredClaims
|
||||
}
|
||||
|
||||
type MyClaims struct {
|
||||
Claims
|
||||
jwt.RegisteredClaims
|
||||
}
|
||||
|
||||
// GenAccessToken 生成Access Token
|
||||
func GenAccessToken(data Claims) (string, error) {
|
||||
claims := MyClaims{
|
||||
Claims: data,
|
||||
RegisteredClaims: jwt.RegisteredClaims{
|
||||
ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Duration(global.Config.Jwt.AccessExpire) * time.Hour)),
|
||||
Issuer: global.Config.Jwt.Issuer,
|
||||
},
|
||||
}
|
||||
|
||||
return jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString([]byte(global.Config.Jwt.AccessSecret))
|
||||
}
|
||||
|
||||
// GenRefreshToken 生成Refresh Token
|
||||
func GenRefreshToken(userID uint) (string, error) {
|
||||
claims := RefreshClaims{
|
||||
UserID: userID,
|
||||
RegisteredClaims: jwt.RegisteredClaims{
|
||||
ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Duration(global.Config.Jwt.RefreshExpire) * time.Hour)),
|
||||
Issuer: global.Config.Jwt.Issuer + "_refresh",
|
||||
},
|
||||
}
|
||||
|
||||
return jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString([]byte(global.Config.Jwt.RefreshSecret))
|
||||
}
|
||||
|
||||
// CheckAccessToken 验证访问令牌
|
||||
func CheckAccessToken(token string) (*MyClaims, error) {
|
||||
claims, err := parseToken(token, global.Config.Jwt.AccessSecret, &MyClaims{})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return claims.(*MyClaims), nil
|
||||
}
|
||||
|
||||
// CheckRefreshToken 验证刷新令牌
|
||||
func CheckRefreshToken(token string) (*RefreshClaims, error) {
|
||||
claims, err := parseToken(token, global.Config.Jwt.RefreshSecret, &RefreshClaims{})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return claims.(*RefreshClaims), nil
|
||||
}
|
||||
|
||||
// parseToken 通用token解析函数
|
||||
func parseToken(token, secret string, claims jwt.Claims) (jwt.Claims, error) {
|
||||
tokenObj, err := jwt.ParseWithClaims(token, claims, func(t *jwt.Token) (interface{}, error) {
|
||||
return []byte(secret), nil
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if tokenObj.Valid {
|
||||
return tokenObj.Claims, nil
|
||||
}
|
||||
|
||||
return nil, errors.New("token无效")
|
||||
}
|
||||
Reference in new issue
Block a user