in Server/go/apptoken/apptoken.go [164:242]
func Parse(tokenStr string) (AppToken, error) {
appToken := AppToken{}
if len(tokenStr) <= VENSION_LENGTH || tokenStr[0:VENSION_LENGTH] != VERSION_0 {
return appToken, errors.New("illegal appToken length")
}
tokenOri := tokenStr[VENSION_LENGTH:]
token, err := base64.StdEncoding.DecodeString(tokenOri)
if err != nil {
return appToken, errors.New("base64.decode appToken failed")
}
tokenDecompress, err := utils.Decompress(token)
if err != nil {
return appToken, errors.New("token decompress failed")
}
// sign
tokenBuf := bytes.NewReader(tokenDecompress)
// signLegth
var signLegth int32
if err := binary.Read(tokenBuf, binary.BigEndian, &signLegth); err != nil {
return appToken, err
}
// signBody
signature := make([]byte, signLegth)
if _, err := io.ReadFull(tokenBuf, signature); err != nil {
return appToken, errors.New("parse sign failed")
}
appToken.Signature = signature
// appId
var appIdLength int32
if err := binary.Read(tokenBuf, binary.BigEndian, &appIdLength); err != nil {
return appToken, err
}
appId := make([]byte, appIdLength)
if _, err := io.ReadFull(tokenBuf, appId); err != nil {
return appToken, errors.New("parse appId failed")
}
appToken.AppId = string(appId)
// issueTimestamp
var issueTimestamp int32
if err := binary.Read(tokenBuf, binary.BigEndian, &issueTimestamp); err != nil {
return appToken, errors.New("parse issueTimestamp failed")
}
appToken.IssueTimestamp = issueTimestamp
// salt
var salt int32
if err := binary.Read(tokenBuf, binary.BigEndian, &salt); err != nil {
return appToken, errors.New("parse salt failed")
}
appToken.Salt = salt
// timestamp
var timestamp int32
if err := binary.Read(tokenBuf, binary.BigEndian, ×tamp); err != nil {
return appToken, errors.New("parse timestamp failed")
}
appToken.Timestamp = timestamp
// service
service, err := UnpackService(tokenBuf)
if err != nil {
return appToken, errors.New("parse service failed")
}
appToken.Service = service
// options
options, err := UnpackAppTokenOptions(tokenBuf)
if err != nil {
return appToken, errors.New("parse appTokenOptions failed")
}
appToken.Options = options
return appToken, nil
}