当前位置: 首页 > news >正文

苹果账号登录后端验证两种方式 python2

import time
import jwt  
import requests  
import json 
import base64def decode_jwt(jwt_token):try:h,p,s = jwt_token.split('.')except:return {},{},{},"","",""header = json.loads(base64.urlsafe_b64decode(h + '==='))  # 可能需要调整填充payload = json.loads(base64.urlsafe_b64decode(p + '==='))  # 可能需要调整填充sign = base64.urlsafe_b64decode(s + '===')  # 可能需要调整填充return header,payload,sign,h,p,sdef auth_apple_by_token(client_id,client_secret,code):"""使用token方式 """url = "https://appleid.apple.com/auth/token"params = {'client_id':client_id,'client_secret':client_secret,'code':code,'grant_type':"authorization_code",}headers = {'Content-Type': 'application/x-www-form-urlencoded'}r = requests.post(url,data=params,headers=headers)print r.status_codeprint r.json()if r.status_code != 200:returnrjson = r.json()id_token,access_token = rjson['id_token'],rjson['access_token']header,payload,sign,h,p,s = decode_jwt(id_token)def auth_apple_by_keys(id_token):"""使用keys 方式"""    header,payload,sign,h,p,s = decode_jwt(id_token)url = "https://appleid.apple.com/auth/keys"r = requests.get(url)keys = r.json()['keys']n,e = '',''for x in keys:if x['kid'] == header['kid']:n,e = x['n'],x['e']breakif not n:n = keys[0]['n']e = keys[0]['e']n_bytes = base64.urlsafe_b64decode(str(n)+"===")e_bytes = base64.urlsafe_b64decode(str(e)+"===")n,e = 0,0for byte in e_bytes:e = (e << 8) | ord(byte)for byte in n_bytes:n = (n << 8) | ord(byte)from cryptography.hazmat.backends import default_backendfrom cryptography.hazmat.primitives import serialization,hashesfrom cryptography.hazmat.primitives.asymmetric import rsa, padding#构建公钥public_key = rsa.RSAPublicNumbers(e, n).public_key(default_backend())# 如果需要,可以将公钥序列化为PEM格式pem = public_key.public_bytes(serialization.Encoding.PEM,serialization.PublicFormat.SubjectPublicKeyInfo)#print(pem)try:decoded = jwt.decode(id_token, key=pem, algorithms=['RS256'],verify=True,audience=payload['aud'])print 'valid1'except Exception as e:print 'invalid1'# 另一种验证方式# hp = h + "." + p# now_ts = time.time()# try:#     public_key.verify(sign,hp,padding.PKCS1v15(),hashes.SHA256())#     if now_ts <= payload['exp']:#         print 'valid2'#     else:#         print 'invalid22'# except Exception as e:#     print 'invalid2',etoken = ""auth_apple_by_keys(token)

相关链接 : https://www.jianshu.com/p/655972b0e7da

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于springboot+vue实现的在线商城系统
  • 面了 5 家知名企业的NLP算法岗(大模型方向),被问麻了。。。。。
  • Sobel边沿检测
  • TPM赋能智能机器人:重塑工业4.0时代的生产力革命
  • 【解决bug之路】npm install node-sass(^4.14.1)连环报错解决!!!(Windows)
  • 达梦数据库导入dmp文件数据
  • 关于Redis集群同步/持久化/淘汰机制的详解
  • html知识点总结
  • Windows子系统Ubuntu安装MySQL及windows的navicate连接
  • NDP协议是怎样帮助IPv6实现网络安全运行的?
  • 技术分享-商城篇-营销模块-优惠券-常见问题(二十五)
  • 油耳朵耳屎怎么清理?可视耳勺使用方法
  • .NET编程——利用C#调用海康机器人工业相机SDK实现回调取图与软触发取图【含免费源码】
  • 搭建Windows下的Rust开发环境
  • mapActions辅助函数的使用
  • CSS3 变换
  • Django 博客开发教程 8 - 博客文章详情页
  • Hibernate最全面试题
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • JavaScript函数式编程(一)
  • Selenium实战教程系列(二)---元素定位
  • socket.io+express实现聊天室的思考(三)
  • text-decoration与color属性
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • windows-nginx-https-本地配置
  • 记录:CentOS7.2配置LNMP环境记录
  • 前端之Sass/Scss实战笔记
  • 前端自动化解决方案
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 以太坊客户端Geth命令参数详解
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • Semaphore
  • 第二十章:异步和文件I/O.(二十三)
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • #APPINVENTOR学习记录
  • #HarmonyOS:Web组件的使用
  • #QT(智能家居界面-界面切换)
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • $(selector).each()和$.each()的区别
  • $NOIp2018$劝退记
  • (AngularJS)Angular 控制器之间通信初探
  • (C语言)fgets与fputs函数详解
  • (C语言)fread与fwrite详解
  • (ibm)Java 语言的 XPath API
  • (八十八)VFL语言初步 - 实现布局
  • (第二周)效能测试
  • (分布式缓存)Redis分片集群
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (篇九)MySQL常用内置函数
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (十六)视图变换 正交投影 透视投影
  • (算法)Travel Information Center