Python后端实现苹果ID登陆踩的坑

  • Code
  • Token

和朋友一起做了个小应用,考虑到方便起见,直接使用了微信登陆,这样也方便了用户。
微信登陆的方式比较简单,前端拉起微信,得到一个code,后端将app_id和app_secret加上这个code一起传到微信服务器,服务器返回一个open_id,access_token和refresh_token,用这个accesss_token就可以得到用户昵称头像等信息。这个open_id可以作为一个用户标识。
准备把应用发布到苹果商店,坑爹的要用苹果登陆。

使用苹果ID在手机应用上登陆会得到两个东西,一个是Code,一个是Token。

在登陆的时候我们想当然的微信类似,用这个code来进行登陆,谁知道掉进了一个大坑。

Code

强烈建议大家不要用这个玩意,每天只能登陆一次,真的很难调试,如果用了这一次机会,就只能等第二天再调试了。

先说一下前期准备,需要TeamID,BundleID, 私钥,然后在平台里面要点上允许登陆。
官方链接:https://developer.apple.com/documentation/sign_in_with_apple/generate_and_validate_tokens

这里app id其实就是bundle id,用的名称不统一,光这个玩意就折腾了大半天。

需要准备的包:requests, pyjwt,cryptography(pyjwt使用ES256加密方式时需要)

直接上代码了:

TEAM_ID = ''
BUNDLE_ID = ''
KEY_FILE = '/home/stamp/app/apple/AuthKey_KDKDKKDKF.p8'
ALG = 'ES256'
KID = 'KDKDKDAFDK'
CODE_URL = 'https://appleid.apple.com/auth/token'
GRAND_TYPE = 'authorization_code'
AUD_URL = 'https://appleid.apple.com'
AUD_WS = 'appleid.apple.com'
VALIDITY_PERIOD = 180
DAY_SECOND = 86400header = {'alg': ALG, 'kid': KID}payload = {'iss': TEAM_ID,'iat': int(time.time()),'exp': int(time.time() + DAY_SECOND * VALIDITY_PERIOD),'aud': AUD_URL,'sub': BUNDLE_ID}private_key = open(KEY_FILE).read()client_sec = jwt.encode(payload=payload, key=private_key, algorithm=ALG, headers=header).decode('utf-8')post_data = {'client_id': BUNDLE_ID,'client_secret': client_sec,'code': code,'grant_type': GRAND_TYPE}login_req = requests.post(url=CODE_URL, data=post_data).json()

到这里和服务器的交互就完成了,需要注意的以下几个方面:
1、key的读取直接读取就行,不需要把里面的部分拿出来作为key。
2、post_data里面的code就是authorizationCode了。
得到如下这些东西:
用户的id就在这个id_token里,这也是一个jwt数据,需要进行解密,其实就是前端能够获得到的token。最关键的是大家注意一下access_token后面那句话Currently, no data set has been defined for access。搞到这里我只能说呵呵了。

当然用官方的说法,我们可以检测用户的appleid的登陆状态。

Token

这个token是一个jwt数据,废话少说直接上代码。

from jwt.algorithms import RSAAlgorithmTOKEN_URL = 'https://appleid.apple.com/auth/keys'def decode_jwt(data):# 从苹果那里拿公钥key_req = requests.get(TOKEN_URL).json()# 从data那里拿到token的加密方式head = jwt.get_unverified_header(data)token_key = head['kid']# 找到相对应的公钥,一般会发布多个公钥for pub_key in key_req['keys']:if pub_key['kid'] == token_key:key_core = simplejson.dumps(pub_key)# 打包公钥key = RSAAlgorithm.from_jwk(key_core)alg = pub_key['alg']breakelse:print('Unable to find public key')return None# 使用公钥来解密claims = jwt.decode(data, key=key, verify=True, algorithms=[alg], audience=BUNDLE_ID)return claims

解出来的的数据如下,其中sub就是用户的标识。

{'iss': 'https://appleid.apple.com', 'aud': '', 'exp': 1592185792, 'iat': 1592185192, 'sub': '', 'c_hash': '9tk4iwHcdTHwVWdYYKR3Xw', 'auth_time': 1592185192, 'nonce_supported': True
}

其实sub在前端是可以直接得到的,但是用后端验证的方式可以提高安全性。

解token的代码也可以用来解密code方法里的的id_token。

Python后端实现苹果ID登陆相关推荐

  1. 怎么更改苹果账户名称_英雄联盟手游平衡补丁介绍 11月平衡更新时间一览 LOL手游怎么用手机合并苹果id和拳头账户_游戏频道...

    lol英雄联盟手游版本的平衡有些差,所以官方即将上线一些补丁优化,那么下面一起来看看lol手游11月平衡更新时间的介绍吧. 英雄联盟手游目前官方已经确认收到了玩家们的抱怨,同时也自己承认了部分英雄的强 ...

  2. Sign in with Apple(苹果授权登陆) java jwt方式验证

    本文章借鉴的原文链接:https://blog.csdn.net/wpf199402076118/article/details/99677412 苹果授权登陆方式 PC/M端授权登陆,采用协议类似于 ...

  3. Sign in with Apple(苹果授权登陆)

    苹果授权登陆方式 1. PC/M端授权登陆,采用协议类似于oauth2协议 2. App端授权登陆,提供两种后端验证方式 开发者后台配置 详细配置参考该文档,手把手教学 https://develop ...

  4. 下列不属于python第三方库的是-python后端开发工程师考证试题

    原标题:python后端开发工程师考证试题 python开发工程师考证试题 选择题 题目 关于 Python 程序格式框架的描述,以下选项中错误的是 ( A ) A: Python 语言不采用严格的& ...

  5. js调用python接口_JavaScript如何调用Python后端服务

    欢迎关注[无量测试之道]公众号,回复[领取资源], Python编程学习资源干货. Python+Appium框架APP的UI自动化. Python+Selenium框架Web的UI自动化. Pyth ...

  6. 盘绕过苹果id方法_如何更换苹果ID?

    众所周知,苹果的电子设备都需要用户登录ID后方可开启功能使用,不论是iphone.ipad还是iPod都是如此,那么遇到换机或者更换使用者的情况时,又该如何更换苹果ID呢? 因为苹果手机使用寿命长,往 ...

  7. 刺激战场国际服服务器如何修改,刺激战场国际服如何更改自己的苹果id地区-无需购买海外id...

    类型:购物比价大小:21.3M语言:中文 评分:10.0 标签: 立即下载 很多的玩家现在都是开始转投刺激战场的国际服,但是还是有很多的玩家不知道该怎么下载苹果ios刺激战场的,好像是和id有关系,这 ...

  8. 苹果手机打字换行怎么换_苹果id怎么换

    苹果id即用户名称,可以将其用于与 Apple 有关的所有操作.用别人的账号激活手机,想换回自己的手机ID账号,怎么操作呢?苹果id怎么换?下面详细教程. 苹果id怎么换 以下图例演示为iOS10系统 ...

  9. 盗销苹果ID成黑色产业链

    突然你的苹果手机变成一块砖头,进入自己的手机系统却要跟所谓专业人士联系,缴纳500元费用后对方才给你解锁.这种"苹果ID敲诈手段"成为近期高发案件,不少苹果用户都遭遇被勒索情形.昨 ...

  10. Python后端技术栈

    Python后端技术栈 Happiness is a way of travel. Not a destination. 幸福是一种旅行方式. 不是目的地. 1.导航 1.1Python 语言基础 1 ...

最新文章

  1. 减少企业Web威胁的三条预防性措施
  2. C# 控件置于最顶层、最底层
  3. 详解HTTP与HTTPS
  4. 关键词分词工具_快图制作工具 | 如何制作词云图?
  5. [html]如何让元素固定在页面底部?有哪些比较好的实践?
  6. 计算机教案的自我分析怎么写,教案的自我分析怎么写.docx
  7. Python OSError: [Errno 22] Invalid argument:的出现和解决
  8. python标准化输出
  9. .NET Core 3.0 Preview 7 已经发布
  10. Rstudio更换默认下载镜像(下载源)教程
  11. 山东民办计算机专业排名2015,2021年山东最好的民办大学排名
  12. python软件如何下载-python软件怎么样?实际的操作方法来了
  13. [译]反射(Reflection)和动态(dynamic)
  14. python面板数据模型操作步骤_面板模型回归操作指南,适合初学者!
  15. GIS软件——ArcGIS去除影像黑边
  16. python字典内置方法_python之字典二 内置方法总结
  17. 二分类确定画出roc曲线,以及基于roc曲线获得最佳划分阈值
  18. Oracle中用sys用户登录
  19. 计算机资源管理器经常停止运行,windows资源管理器已停止工作一直弹出来彻底解决方案...
  20. 第五课:BCD计数器设计与验证

热门文章

  1. 为什么原理图中元器件下面有红色波浪线?
  2. linux日志分析步骤,Linux系统日志分析的基本教程
  3. NotePad++ 正则表达式
  4. android 5.01,爱思加强版
  5. Zabbix4.0安装教程
  6. 华为手机助手(PC)无法连接的通用解决方案
  7. 自然语言表示简史(BERT/ELMO/Word2vec/LDA/Bow/Ohehot,词向量、句向量、优缺点、应用与解决的问题)
  8. 电商商品中心类目体系
  9. ic卡c语言程序,sle4442程序(ic卡程序,C语 - 控制/MCU - 电子发烧友网
  10. 使用matlab计算 洛伦兹方程 的李雅普诺夫指数