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
}

最新文章

  1. 1Z0-053 争议题目解析684
  2. 利用Scala语言开发Spark应用程序
  3. Atitit。如何实现dip, di ,ioc ,Service Locator的区别于联系
  4. 匹配img和a
  5. Sublime Text3 包管理器、插件安装
  6. JS操作JSON总结(转)
  7. O(1)调度器的时间计算公式与CFS调度器
  8. fedora23开发环境搭建手册
  9. c - 折半查找(二分法检索)
  10. 让 collabtive-11 支持中文
  11. Android四个存储数据的SharedPreferences
  12. 老李分享:loadrunner用javavuser进行接口测试
  13. 使用crontab,让linux定时执行shell脚本
  14. go语言常用开源库整理
  15. 洛谷P2144 [FJOI2007]轮状病毒
  16. Linux——浅析信号处理
  17. jmeter配置脚本录制进行抓包并快速分析、定位接口问题
  18. Django--视图函数views
  19. Linux内核分析第二周:操作系统是如何工作的
  20. MySql表结构修改详解

热门文章

  1. 手把手教你调试SpringBoot启动 IoC容器初始化源码,spring如何解决循环依赖
  2. Java基础系列(40)- Arrays类
  3. spring入门3-jdbcTemplate简单使用和声明式事务
  4. php/awk 处理csv 使用 SplFileObject 操作文件
  5. python学习笔记(一)-基础知识
  6. 关于cgroup的几个核心名词及其关系
  7. 深入理解Python切片
  8. 动图图解GC算法 - 让垃圾回收动起来!
  9. 使用VisualStudioCode开发Vue
  10. 【理解OS】1.保护模式概述