1. 验证苹果登录,官方提供两种验证方法,一种是token,另一个种是code。这里使用的是token

  2. 登录流程:

    1. 苹果客户端调用苹果API,获取到用户的信息,包括:

      1. user_id
      2. 昵称
      3. identity_token
    2. 苹果客户端发送identity_token到服务端
    3. 服务端验证identity_token是否合法,并解析数据,得到user_id。这个user_id和上面的user_id是一样的
    4. 服务端检查该user_id是否已注册,如果是,返回登录信息。如果否,注册。
  3. 验证的原理:

    1. 苹果会把用户的信息放在一个json里面,然后使用私钥对json签名。
    2. 服务端调用苹果API拿到公钥,然后验证签名是否正确。
    3. 所以总的来说就是使用RSA私钥签名的算法来保证数据不会被篡改。
  4. identity_token解析后包含几部分内容

    1. header。

      1. 例子:{u'alg': u'RS256', u'kid': u'86D88Kf'}
      2. alg是加密算法类型
      3. kid是使用的公钥的id
    2. payload或者claims 。也就是数据:
      1. 例子:

      {

      u'c_hash': u'HpjAKvLjivbJr9j9ZxfFxA',

      u'aud': u'com.kugou.moe',

      u'iss': u'https://appleid.apple.com',

      u'email_verified': u'true',

      u'nonce_supported': True,

      u'exp': 1583829815,

      u'auth_time': 1583829215,

      u'iat': 1583829215,

      u'email': u'huanghuixia5@163.com',

      u'sub': u'001712.90358ddaa2294989b3b7c88b30086b37.0724' # 用户唯一标志,相当于openid

      }

      ```

      1. aud 客户端的报名。
      2. exp。超时时间,时间戳。当前时间如果大于这个时间,会报超时错误
      3. email 用户的email
      4. sub 用户的user_id

demo

使用了python-jwt这个库。安装方法:pip install python-jwt

# encoding=utf8
import requests
import logging
import python_jwt as jwt, jwcrypto.jwk as jwk log = logging.getLogger('test') class AppleLoginManager(object):
"""
苹果登录
""" @classmethod
def get_key(cls, kid):
"""
访问apple 获取公钥。apple的接口会返回很多公钥的,根据jwt数据header的kid,找到对应的公钥
:param kid:
:return: {
"kty": "RSA",
"kid": "eXaunmL",
"use": "sig",
"alg": "RS256",
"n": "4dGQ7bQK8LgILOdLsYzfZjkEAoQeVC_aqyc8GC6RX7dq_KvRAQAWPvkam8VQv4GK5T4ogklEKEvj5ISBamdDNq1n52TpxQwI2EqxSk7I9fKPKhRt4F8-2yETlYvye-2s6NeWJim0KBtOVrk0gWvEDgd6WOqJl_yt5WBISvILNyVg1qAAM8JeX6dRPosahRVDjA52G2X-Tip84wqwyRpUlq2ybzcLh3zyhCitBOebiRWDQfG26EH9lTlJhll-p_Dg8vAXxJLIJ4SNLcqgFeZe4OfHLgdzMvxXZJnPp_VgmkcpUdRotazKZumj6dBPcXI_XID4Z4Z3OM1KrZPJNdUhxw",
"e": "AQAB"
}
"""
ret = requests.get('https://appleid.apple.com/auth/keys')
ret_json = ret.json()
for key in ret_json['keys']:
if key['kid'] == kid:
return key
log.error(u'[苹果登录]找不到对应的kid %s %s' % (kid, ret_json))
raise Exception('找不到对应的kid') @classmethod
def verify_jwt(cls, token):
"""
验证jwt数据,返回:
{
u'c_hash': u'HpjAKvivbJr9j9ZxfFxA',
u'aud': u'com.test.moe',
u'iss': u'https://appleid.apple.com',
u'email_verified': u'true',
u'nonce_supported': True,
u'exp': 1583829815,
u'auth_time': 1583829215,
u'iat': 1583829215,
u'email': u'hua@163.com',
u'sub': u'0017xx.9035989b3bxxxxx7c88b30086b37.xxx' # 用户唯一标志,相当于openid
} """
header, claims = jwt.process_jwt(token) # 获取信息,但是不验证
if claims['aud'] != 'com.test.test': # 检验是不是自己的安装包名
log.error(u'[苹果登录]aud异常 aud:%s token:%s' % (claims['aud'], token))
raise Exception(u'安装包名异常')
key_obj = AppleLoginManager.get_key(header['kid']) key = jwk.JWK(**key_obj) header, claims = jwt.verify_jwt(token, key, [key_obj['alg']], checks_optional=1) # 获取信息并验证
return claims @classmethod
def get_access_info(cls, token):
"""获取授权信息"""
try:
resp_json = AppleLoginManager.verify_jwt(token)
return {
"open_id": resp_json['sub'],
}
except:
log.exception(u'苹果登录异常,token:%s' % token)
raise Exception('苹果登录异常') token = '''xxxx''' #前端传过来的 identity_token
AppleLoginManager.get_access_info(token)

Python 解密JWT验证苹果登录的更多相关文章

  1. 苹果登录服务端JWT算法验证-PHP

    验证参数 可用的验证参数有 userID.authorizationCode.identityToken,需要iOS客户端传过来 验证方式 苹果登录验证可以选择两种验证方式 具体可参考这篇文章 htt ...

  2. python 加密 解密 签名 验证签名 公钥 私钥 非对称加密 RSA

    加密与解密,这很重要,我们已经可以用pypcap+npcap简单嗅探到网络中的数据包了.而这个工具其实可以嗅探到更多的数据.如果我们和别人之间传输的数据被别人嗅探到,那么信息泄漏,信息被篡改,将给我们 ...

  3. Jwt验证登录

    练习模板:https://gitee.com/zh1446802857/swagger-multi-version-api.git Jwt在我的 认知里,是一套门锁.别人(用户)需要用到你的接口 的时 ...

  4. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

  5. Python 生成 JWT(json web token) 及 解析方式

    一.关于 jwt 的原理及概念可以自行在网络上搜索了解一下,这里推荐一篇写的比较好的博客 深入了解Json Web Token之概念篇 另附 JWT 的官方文档: https://jwt.io/int ...

  6. JWT验证机制【刘新宇】【Django REST framework中使用JWT】

    JWT 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证.我们不再使用Session认证机制,而使用Json Web Token认证机制. 什么是JWT Json web t ...

  7. springBoot整合spring security+JWT实现单点登录与权限管理--筑基中期

    写在前面 在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与 ...

  8. Python 实现 JWT 生成

    Python 实现 JWT 生成 JWT 简介:https://www.jianshu.com/p/576dbf44b2ae Json web token (JWT), 是为了在网络应用环境间传递声明 ...

  9. python paramiko模块SSH自动登录linux系统进行操作

    1). Linux系统首先要开启SSH服务:service ssh status 如果没安装的话,则要:apt-get install openssh-server service ssh resta ...

随机推荐

  1. Laravel5.4 队列简单配置与使用

    概述 什么是队列? 百度百科是这样说的 “队列”是在传输过程中保存数据的容器. 举几个生活中例子: * iphone手机新款发布,三里屯iphone进的新货.大家要排队买,不能说一大堆人一起冲进去,那 ...

  2. YII框架开发一个项目的通用目录结构:

    testdrive/    index.    assets/    css/    images/    themes/           yiic.       commands/        ...

  3. 吴裕雄--天生自然 HADOOP大数据分布式处理:安装配置JAVA

    tar -xzvf jdk-8u151-linux-x64.tar.gz -C /usr/local/src sudo vim /etc/profile .编辑/etc/profile # JAVA ...

  4. URI和URL对比

    URL是Uniform Resoure Locator(统一资源定位器)的缩写.就是WWW页的地址. 其URL地址格式排列为:scheme://host:Port/path --Internet资源类 ...

  5. HOG算法基础

    实现思路步骤: 1.对原图像gamma校正,img=sqrt(img); 2.求图像竖直边缘,水平边缘,边缘强度,边缘斜率. 3.将图像每16*16(取其他也可以)个像素分到一个cell中.对于256 ...

  6. DIP|PCN|CoevDB|PID|Y2H|RosettaDock Serve|元基因组学|微生物多样性

    生命组学: 比较真核生物有关呼吸链的gene是比较核外编码基因,因为与呼吸有关的功能在线粒体上,线粒体位于核外.想要查看两种基因是否具有相互作用,可以对不同物种的编码ATP6 和ATP8的直系同源基因 ...

  7. GUI-猜字游戏

    # 设计思想先定义输入,输入,然后设计逻辑 # GUI from tkinter # 逻辑层 # 设计GUI(用户界面) from tkinter import * import tkinter.si ...

  8. pycharm全局搜索快捷键无反应

    原因:和搜狗输入法的快捷键冲突

  9. abator中可生成iBatis的代码

    1.insert 不论你设置多少个字段,统一都要添加一遍 比如:insert into tb_user (id,name,age,password) value (null,”张三”,null,nul ...

  10. C++中的大数乘的实现

    代码 来源:面试常考 大数加减乘除 #include <iostream> #include <vector> #include <string> using na ...