85 lines
1.9 KiB
Go
85 lines
1.9 KiB
Go
package utils
|
|
|
|
import (
|
|
"errors"
|
|
"github.com/dgrijalva/jwt-go"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
const (
|
|
AdminAccountKey = "AdminAccount"
|
|
AccountTypeKey = "AccountType"
|
|
)
|
|
|
|
//CreateToken 生成Token算法
|
|
func CreateToken(secret string, tokenClaims map[string]interface{}) (tokeness string, err error) {
|
|
if secret == "" {
|
|
return "", errors.New("secret is empty")
|
|
}
|
|
claims := jwt.MapClaims(tokenClaims)
|
|
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
|
tokeness, err = token.SignedString([]byte(secret))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return tokeness, nil
|
|
}
|
|
|
|
func keyFunc(secret string) jwt.Keyfunc {
|
|
return func(token *jwt.Token) (interface{}, error) {
|
|
return []byte(secret), nil
|
|
}
|
|
}
|
|
|
|
//ParseToken 解析Token
|
|
func ParseToken(secret string, tokeness string) (map[string]interface{}, error) {
|
|
if secret == "" || tokeness == "" {
|
|
return nil, errors.New("secret or tokeness is empty")
|
|
}
|
|
token, err := jwt.Parse(tokeness, keyFunc(secret))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
//验证token,如果token被修改过则为false
|
|
if !token.Valid {
|
|
return nil, errors.New("token is invalid")
|
|
}
|
|
claimsToken, ok := token.Claims.(jwt.MapClaims)
|
|
if !ok {
|
|
return nil, errors.New("cannot convert claim to MapClaim")
|
|
}
|
|
return claimsToken, nil
|
|
}
|
|
|
|
// GetAdmin 获取管理员账号
|
|
// oauth.Auth执行后有效
|
|
func GetAdmin(ctx *gin.Context) (account string, err error) {
|
|
val, exists := ctx.Get(AdminAccountKey)
|
|
if !exists {
|
|
err = errors.New("admin account not exist")
|
|
return
|
|
}
|
|
|
|
account, ok := val.(string)
|
|
if !ok {
|
|
return "", errors.New("admin account type error")
|
|
}
|
|
return
|
|
}
|
|
|
|
// GetAccountType 获取账号类型
|
|
// oauth.Auth执行后有效
|
|
func GetAccountType(ctx *gin.Context) (string, error) {
|
|
var err error
|
|
val, exists := ctx.Get(AccountTypeKey)
|
|
if !exists {
|
|
err = errors.New("claims not exist")
|
|
return "", err
|
|
}
|
|
accType, ok := val.(string)
|
|
if !ok {
|
|
return "", errors.New("claims type error")
|
|
}
|
|
return accType, nil
|
|
}
|