golang 后台 苹果一键登陆 sing in with apple

本文主要展现golang后台编写苹果一键登陆的代码.苹果一键登陆的流程需自行去查看相关文档前端

这是解析 identity_token的方法来验证    若是是用code的话验证 请去 https://blog.csdn.net/tptpppp/article/details/99288426 也是获得苹果的token而后解析出来验证前端传入的user,git

package main

import (
"crypto/rsa"
"fmt"
"github.com/astaxie/beego"
"github.com/dgrijalva/jwt-go"
"github.com/lestrrat-go/jwx/jwk"
"net/http"
)

// 解析token
func AppleParseToken(appleToken string) (*jwt.Token, error) {

set, err := jwk.FetchHTTP("https://appleid.apple.com/auth/keys", jwk.WithHTTPClient(http.DefaultClient))
if err != nil {
return nil, err
}
var isSuccess bool
var token *jwt.Token
  
// 苹果这个秘钥有点坑,返回了三个公钥,要对每个公钥都去进行解析,有一个成功了就行,全失败才算失败,一开始项目只用了其中一个公钥,运气好每次都成功解析出来了,直到上生产环境才测出来这个bug
for _, key := range set.Keys{
pubKeyIface, _ := key.Materialize()
pubKey, ok := pubKeyIface.(*rsa.PublicKey)
if !ok {
beego.Error(fmt.Errorf(`expected RSA public key from %s`, "https://appleid.apple.com/auth/keys"))
continue
}

token, err = jwt.Parse(appleToken, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok {
beego.Error(fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]))
}
return pubKey, nil
})

if err != nil {
beego.Warning("Token Parse error:", err)
continue
}
if !token.Valid {
err = errors.New("token 无效")
beego.Warning("token 无效")
continue
}
isSuccess = true
break
}
if isSuccess {
return token, nil
}
return nil, errors.New("token 无效")
}


须要前端传一个苹果用户惟一标识符user 以及identity_token, 将
identity_token 传入函数解析出来,再用
claims := token.Claims.(jwt.MapClaims)
sub := claims["sub"].(string)

而后用sub跟user比较一下不相等的话就表明前端传的user=有问题,相等的话就存下user惟一标识符进行注册就能够了.