import time
import jwt
import requests
import json
from jwt.algorithms import RSAAlgorithm
from django.utils import timezone
from datetime import timedelta
import ******.settings
data_list = {
"errMsg": "getUserInfo:ok",
"userInfo": {
"openId": "******",
"fullName": {},
"authorizationCode": "******",
"identityToken": "******",
"realUserStatus": 1
}
}
timezone.now()
TEAM_ID = \'******\'
BUNDLE_ID = \'******\'
ALG = \'ES256\'
KID = \'******\'
CODE_URL = \'https://appleid.apple.com/auth/token\'
GRAND_TYPE = \'authorization_code\'
AUD_URL = \'https://appleid.apple.com\'
AUD_WS = \'appleid.apple.com\'
TOKEN_URL = \'https://appleid.apple.com/auth/keys\'
PRIVATE_KEY = """-----BEGIN PRIVATE KEY-----
******
-----END PRIVATE KEY-----
"""
# header = {"alg": "ES256", \'kid\': KID}
header = {"alg": "ES256", \'kid\': KID}
payload = {
\'iss\': TEAM_ID,
\'iat\': timezone.now(),
\'exp\': timezone.now() + timedelta(days=180),
\'aud\': AUD_URL,
\'sub\': BUNDLE_ID
}
client_secret = jwt.encode(payload, PRIVATE_KEY, headers=header)
# print(type(client_secret))
def post_datas(code):
post_data = {
\'client_id\': BUNDLE_ID,
\'client_secret\': client_secret,
# \'code\': data_list[\'userInfo\'][\'authorizationCode\'],
\'code\': code,
\'grant_type\': GRAND_TYPE,
}
login_req = requests.post(url=CODE_URL, data=post_data,
headers={"Content-Type": "application/x-www-form-urlencoded"}
)
if login_req.status_code == 200:
pass
else:
post_data[\'grant_type\'] = \'refresh_token\'
post_data[\'refresh_token\'] = \'******\'
post_data[\'redirect_uri\'] = \'******\'
key_req = requests.get(TOKEN_URL).json()
# 从data那里拿到token的加密方式
head = jwt.get_unverified_header(login_req.json()[\'id_token\'])
token_key = head[\'kid\']
# 找到相对应的公钥,一般会发布多个公钥
for pub_key in key_req[\'keys\']:
if pub_key[\'kid\'] == token_key:
key_core = json.dumps(pub_key)
# 打包公钥
key = RSAAlgorithm.from_jwk(key_core)
alg = pub_key[\'alg\']
break
else:
print(\'Unable to find public key\')
return None
# 使用公钥来解密
claims = jwt.decode(login_req.json()[\'id_token\'].encode("utf-8"), key=key, verify=True, algorithms=[alg],
audience=BUNDLE_ID)
return claims[\'sub\']
print(post_datas(****))