func Parse()

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, &timestamp); 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
}