You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
1.8 KiB
86 lines
1.8 KiB
2 years ago
|
package xtoken
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"encoding/json"
|
||
|
"errors"
|
||
|
"git.diulo.com/mogfee/protoc-gen-kit/pkg/jwts"
|
||
|
"git.diulo.com/mogfee/protoc-gen-kit/pkg/xaes"
|
||
|
"git.diulo.com/mogfee/protoc-gen-kit/pkg/xbase64"
|
||
|
"github.com/dgrijalva/jwt-go"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
// expiredTime 授权结束时间
|
||
|
expiredTime = 7200
|
||
|
|
||
|
tokenKey = "68Tz&xWUW5U$Id45"
|
||
|
)
|
||
|
|
||
|
type TokenInfo struct {
|
||
|
Id int64
|
||
|
Permission []string
|
||
|
}
|
||
|
|
||
|
var tokenExpired = errors.New("token expired")
|
||
|
|
||
|
type tokenStoreInfo struct {
|
||
|
Created int64 `json:"created"`
|
||
|
ExpiredAt int64 `json:"expired_at"`
|
||
|
Id int64 `json:"id"`
|
||
|
Permission []string `json:"permission"`
|
||
|
}
|
||
|
|
||
|
func GetTokenStr(ctx context.Context, info TokenInfo) (string, error) {
|
||
|
ctime := time.Now().Unix()
|
||
|
|
||
|
tokenString, err := jwts.JWTGetMapString(jwt.MapClaims{
|
||
|
"id": info.Id,
|
||
|
"permission": info.Permission,
|
||
|
"created": ctime,
|
||
|
"expired_at": ctime + expiredTime,
|
||
|
})
|
||
|
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
aesString, err := xaes.Encrypt([]byte(tokenString), []byte(tokenKey))
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
return xbase64.Encode(string(aesString)), nil
|
||
|
}
|
||
|
|
||
|
func ParseToken(tokenStr string) (*TokenInfo, error) {
|
||
|
tokenStr, err := xbase64.Decode(tokenStr)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
body, err := xaes.Decrypt([]byte(tokenStr), []byte(tokenKey))
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
mps, err := jwts.JWTGetStringMap(string(body))
|
||
|
if err != nil {
|
||
|
return nil, errors.New("token parse error")
|
||
|
}
|
||
|
b, _ := json.Marshal(mps)
|
||
|
row := tokenStoreInfo{}
|
||
|
if err = json.Unmarshal(b, &row); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
if row.ExpiredAt < time.Now().Unix() || row.Id <= 0 {
|
||
|
return nil, tokenExpired
|
||
|
}
|
||
|
|
||
|
return &TokenInfo{
|
||
|
Id: row.Id,
|
||
|
Permission: row.Permission,
|
||
|
}, nil
|
||
|
}
|
||
|
func IsExpired(err error) bool {
|
||
|
return err == tokenExpired
|
||
|
}
|