zoukankan      html  css  js  c++  java
  • Go语言实现APPID登录

    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
    }
    
    
    
  • 相关阅读:
    Javascript一天学完系列(四)函数上下文bind &call
    Javascript一天学完系列(三)JavaScript面向对象
    Javascript一天学完系列(二)Callbacks回调函数
    Python(切片)
    水果篮子(母函数)
    判断链表是否有环
    链表部分逆置
    Python(List和Tuple类型)
    HDU1426(DFS)
    HDU4474(数位BFS)
  • 原文地址:https://www.cnblogs.com/HappyTeemo/p/15397149.html
Copyright © 2011-2022 走看看