12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- package token
- import (
- "encoding/json"
- "fmt"
- mhayaCrypto "github.com/mhaya/extend/crypto"
- mhayaTime "github.com/mhaya/extend/time"
- "github.com/mhaya/game/game_cluster/internal/code"
- mhayaLogger "github.com/mhaya/logger"
- )
- const (
- hashFormat = "pid:%d,openid:%s,playerid:%s,targetPath:%s,timestamp:%d"
- tokenExpiredDay = 3
- )
- type Token struct {
- PID int `json:"pid"`
- OpenID string `json:"open_id"`
- PlayerID string `json:"player_id"`
- TargetPath string `json:"target_path"`
- Nickname string `json:"nickname"`
- Timestamp int64 `json:"tt"`
- Hash string `json:"hash"`
- }
- func New(pid int, openId, playerId, targetPath, nickName string, appKey string) *Token {
- token := &Token{
- PID: pid,
- OpenID: openId,
- PlayerID: playerId,
- TargetPath: targetPath,
- Nickname: nickName,
- Timestamp: mhayaTime.Now().ToMillisecond(),
- }
- token.Hash = BuildHash(token, appKey)
- return token
- }
- func (t *Token) ToBase64() string {
- bytes, _ := json.Marshal(t)
- return mhayaCrypto.Base64Encode(string(bytes))
- }
- func DecodeToken(base64Token string) (*Token, bool) {
- if len(base64Token) < 1 {
- return nil, false
- }
- token := &Token{}
- bytes, err := mhayaCrypto.Base64DecodeBytes(base64Token)
- if err != nil {
- mhayaLogger.Warnf("base64Token = %s, validate error = %v", base64Token, err)
- return nil, false
- }
- err = json.Unmarshal(bytes, token)
- if err != nil {
- mhayaLogger.Warnf("base64Token = %s, unmarshal error = %v", base64Token, err)
- return nil, false
- }
- return token, true
- }
- func Validate(token *Token, appKey string) (int32, bool) {
- now := mhayaTime.Now()
- now.AddDays(tokenExpiredDay)
- if token.Timestamp > now.ToMillisecond() {
- mhayaLogger.Warnf("token is expired, token = %s", token)
- return code.AccountTokenValidateFail, false
- }
- newHash := BuildHash(token, appKey)
- if newHash != token.Hash {
- mhayaLogger.Warnf("hash validate fail. newHash = %s, token = %s", token)
- return code.AccountTokenValidateFail, false
- }
- return code.OK, true
- }
- func BuildHash(t *Token, appKey string) string {
- value := fmt.Sprintf(hashFormat, t.PID, t.OpenID, t.PlayerID, t.TargetPath, t.Timestamp)
- return mhayaCrypto.MD5(value + appKey)
- }
|