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

2024-09-07 13:04

本文主要是介绍苹果账号登录后端验证两种方式 python2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

import json
import jwt  
import requests  
import json 
import base64def decode_jwt(jwt_token):try:header,payload,sign = jwt_token.split('.')except:return {},{},""header = json.loads(base64.urlsafe_b64decode(header + '==='))  # 可能需要调整填充payload = json.loads(base64.urlsafe_b64decode(payload + '==='))  # 可能需要调整填充return header,payload,signdef 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 = decode_jwt(id_token)def auth_apple_by_keys(id_token):"""使用keys 方式"""    header,payload,sign = 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 'valid'except Exception as e:print 'invalid'# try:#     public_key.verify(sign,id_token,padding.PKCS1v15(),hashes.SHA256())#     print 'valid'# except Exception as e:#     print 'invalid',etoken = ""auth_apple_by_keys(token)

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

这篇关于苹果账号登录后端验证两种方式 python2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1145128

相关文章

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【即时通讯】轮询方式实现

技术栈 LayUI、jQuery实现前端效果。django4.2、django-ninja实现后端接口。 代码仓 - 后端 代码仓 - 前端 实现功能 首次访问页面并发送消息时需要设置昵称发送内容为空时要提示用户不能发送空消息前端定时获取消息,然后展示在页面上。 效果展示 首次发送需要设置昵称 发送消息与消息展示 提示用户不能发送空消息 后端接口 发送消息 DB = []@ro

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

脏页的标记方式详解

脏页的标记方式 一、引言 在数据库系统中,脏页是指那些被修改过但还未写入磁盘的数据页。为了有效地管理这些脏页并确保数据的一致性,数据库需要对脏页进行标记。了解脏页的标记方式对于理解数据库的内部工作机制和优化性能至关重要。 二、脏页产生的过程 当数据库中的数据被修改时,这些修改首先会在内存中的缓冲池(Buffer Pool)中进行。例如,执行一条 UPDATE 语句修改了某一行数据,对应的缓