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.
85 lines
1.8 KiB
85 lines
1.8 KiB
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 |
|
}
|
|
|