Go语言实现APPID登录
2024-10-19 23:40:06
package thirdparty
import (
"crypto/rsa"
"fmt"
"github.com/dgrijalva/jwt-go"
"github.com/lestrrat-go/jwx/jwk"
"github.com/pkg/errors"
"github.com/wonderivan/logger"
"math/big"
"net/http"
)
func bigFromByte(s []uint8) *big.Int {
ret := new(big.Int)
ret.SetBytes(s)
return ret
}
// 解析token
func AppleParseToken(appleToken string) (string, error) {
set, err := jwk.FetchHTTP("https://appleid.apple.com/auth/keys",
jwk.WithHTTPClient(http.DefaultClient))
if err != nil {
return "", err
}
var isSuccess bool
var token *jwt.Token //要对每一个公钥都去进行解析,有一个成功了就行,全失败才算失败
for _, key := range set.Keys {
fmt.Println(key)
NIface, _ := key.Get("n")
NStr := NIface.([]uint8)
EIface, _ := key.Get("e")
EStr := EIface.([]uint8)
pubKey := &rsa.PublicKey{N: bigFromByte(NStr), E: int(bigFromByte(EStr).Int64())}
token, err = jwt.Parse(appleToken, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok {
logger.Error("Unexpected signing method: %v", token.Header["alg"])
}
return pubKey, nil
})
if err != nil {
logger.Error("Token Parse error:", err)
continue
}
if !token.Valid {
logger.Error("Token is invalid")
continue
}
isSuccess = true
break
}
if isSuccess == false {
return "", errors.New("Token is invalid")
}
claims := token.Claims.(jwt.MapClaims)
sub, ok := claims["sub"].(string)
if !ok || sub == "" {
return "", errors.New("Token abnormal")
}
logger.Info("Token verification success")
return sub, nil
}
最新文章
- 1Z0-053 争议题目解析684
- 利用Scala语言开发Spark应用程序
- Atitit。如何实现dip, di ,ioc ,Service Locator的区别于联系
- 匹配img和a
- Sublime Text3 包管理器、插件安装
- JS操作JSON总结(转)
- O(1)调度器的时间计算公式与CFS调度器
- fedora23开发环境搭建手册
- c - 折半查找(二分法检索)
- 让 collabtive-11 支持中文
- Android四个存储数据的SharedPreferences
- 老李分享:loadrunner用javavuser进行接口测试
- 使用crontab,让linux定时执行shell脚本
- go语言常用开源库整理
- 洛谷P2144 [FJOI2007]轮状病毒
- Linux——浅析信号处理
- jmeter配置脚本录制进行抓包并快速分析、定位接口问题
- Django--视图函数views
- Linux内核分析第二周:操作系统是如何工作的
- MySql表结构修改详解