苹果账号登录后端验证两种方式 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
相关文章:
苹果账号登录后端验证两种方式 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 )) # 可能需要调整填充pa…...
FlinkCDC 3.2.0 新增优点 Pattern Replacement in routing rules
新增优点:Pattern Replacement in routing rules flinkcdc 3.2.0版本相较于3.1.0版本,避免了多表多sink多次写 route 路由的麻烦,类似于统一前后缀的形式多表多sink,通过<>正则,大大减少了书写 官网࿱…...
《 C++ 修炼全景指南:六 》深入探索 C++ 标准库中的 stack 与 queue 容器适配器
1、引言 1.1、容器适配器的概念与应用 容器适配器(Container Adapters)是 C 标准库提供的一种特殊容器,它不是一种独立的容器,而是对其他标准容器的封装,用来实现特定的数据结构如栈(stack)和…...
高级java每日一道面试题-2024年9月07日-JVM篇-说一下类加载的执行过程?
如果有遗漏,评论区告诉我进行补充 面试官: 说一下类加载的执行过程? 我回答: 在Java中,类的加载是一个重要的过程,它是由Java虚拟机(JVM)的类加载器系统负责的。类加载的过程不仅仅包括加载类的字节码到内存中,还包…...
笔试强训day09
添加逗号 import sysa list(input())[::-1] s "" cnt 0 for v in a:cnt 1s vif cnt%30:s , print(s.rstrip(,)[::-1])跳台阶 import sys import functools functools.cache def dfs(u):if u1 or u2:# print(f"u {u}")return ureturn dfs(u-1)dfs(…...
软件测试中的黑盒测试方法,包括其定义、目的及主要步骤。
黑盒测试(Black Box Testing)是一种软件测试方法,它侧重于软件的功能性需求验证,而不考虑程序内部结构或代码实现细节。这种方法是从最终用户的角度出发,检查系统是否按照规格说明书的要求工作。黑盒测试的主要目的是验…...
Shell脚本计算π的近似值
计算π的公式很多,本文使用“π的莱布尼茨公式”来计算π的近似值,对应的公式如下: http://upload.wikimedia.org/math/9/e/8/9e804b8a1a11e442be93fed1d52205a9.png 由此我们可以得到求解π的公式为:π=4*(1-(1/3)+(1/5)-(1/7)+(1/9)...) 下面是在linux下使用shell脚本命令…...
进程间通信之消息队列
作用 进程间通信 特点 1 、消息队列中的消息是有类型的。 类型 : 自定义的结构体 , 第一个成员必须是 long 型的 . 表示为该消息的类型 如 : typedef struct 结构体名称 { long type; // 消息的正文 char name[50]; char sex[10]; int age; ... } 别名 ; 2 、消息队…...
人生苦短我用Python 5-xlwings自动调整表格
人生苦短我用Python 5-xlwings自动调整表格 前言依赖主要类App类Books类Sheet 类 示例代码 前言 使用pandas库openpyxl库实现了csv与excel文件的互相转换,csv转excel后若数据超出了单元格的宽度,部分数据无法完整显示。需要手动打开Excel文件࿰…...
移动跨平台框架Flutter详细介绍和学习线路分享
Flutter是一款移动应用程序SDK,一份代码可以同时生成iOS和Android两个高性能、高保真的应用程序。 Flutter目标是使开发人员能够交付在不同平台上都感觉自然流畅的高性能应用程序。我们兼容滚动行为、排版、图标等方面的差异。 在全世界,Flutter正在被越…...
线性代数基础:向量、矩阵、张量及其在机器学习中的应用详解
线性代数基础:向量、矩阵、张量及其在机器学习中的应用详解 线性代数基础:向量、矩阵、张量及其在机器学习中的应用详解一、向量 (Vectors)1. 向量的定义2. 向量在机器学习中的应用3. 向量空间 二、矩阵 (Matrices)1. 矩阵的定义2. 矩阵在机器学习中的应…...
Dockerfile中的RUN、CMD、ENTRYPOINT指令区别
RUN在构建过程中在镜像中执行命令。CMD容器创建时的默认命令。(可以被覆盖)ENTRYPOINT容器创建时的主要命令。(不可被覆盖) 指令介绍 1.RUN 在构建过程中在镜像中执行命令,是在 docker build中执行 2.CMD 作用&am…...
css grid布局属性详解
Grid布局 前言一、认识Grid1.1容器和项目1.2行和列1.3单元格和网格线 二、容器属性2.1.grid-template-columns与grid-template-rows属性2.1.1 直接使用长度单位比如px2.1.2 使用百分比 %2.1.3 使用repeat函数2.1.4 按比例划分 fr 关键字2.1.5 自动填充 auto 关键字2.1.6 最大值…...
Tranformer分布式特辑
随着大模型的发展,如何进行分布式训练也成了每位开发者必备的技能。 1. 单机训练 CPU OffloadingGradient Checkpointing 正向传播时,不存储当前节点的中间结果,在反向传播时重新计算,从而起到降低显存占用的作用 Low Precision…...
【Moveit2官方教程】使用 MoveIt Task Constructor (MTC) 框架来定义和执行一个机器人任务
#include <rclcpp/rclcpp.hpp> // ROS 2 的核心库 #include <moveit/planning_scene/planning_scene.h> // MoveIt 规划场景相关的头文件 #include <moveit/planning_scene_interface/planning_scene_interface.h> // MoveIt 规划场景接口 #include <m…...
使用docker配置wordpress
docker的安装 配置docker yum源 sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo下载最新版本docker sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-…...
JVM字节码
JVM字节码详解 引言 JVM(Java Virtual Machine,Java虚拟机)字节码是一种中间代码,主要用于Java平台上的程序在不同硬件平台上的移植。Java程序通过编译器将源代码编译成字节码,然后通过JVM解释或即时编译(…...
python访问mysql
要在 Python 中访问 MySQL 数据库,通常会使用 mysql-connector-python 或 pymysql 这两个库之一。以下是使用这两个库的基本示例: 使用 mysql-connector-python 安装库: pip install mysql-connector-python示例代码: import mysql.connector# 连接到 M…...
Java工具插件
一、springboot集成mqtt订阅 阿里云MQTT使用教程_复杂的世界311的博客-CSDN博客_阿里云mqtt 阿里云创建MQTT服务 先找到产品与服务,然后选择物联网平台,找到公共实例,创建一个产品。 创建产品 然后在左侧下拉栏找到设备管理,在设备管理下拉栏找到设备,然后添加设备。添加…...
Class3——Esp32|Thonny——网络连接主机-wifi连接(源代码带教程)
废话不多说——直接上配置源码和图片 一.电脑连接到wifi上(不能是5G) 二.网络调试助手信息设置绑定 1.获取电脑wifi信息 2.设置网络调试助手为一致,然后打开,主机地址是上面的192.168.2.149端口自己设置,UDP然后打开…...
TypeScript实战:手把手教你实现4种不依赖第三方库的UUID生成器(附完整代码)
TypeScript实战:4种零依赖UUID生成器的实现与优化 在小程序开发或特殊环境下,我们常常面临无法使用第三方库的困境。UUID作为分布式系统中唯一标识符的核心组件,其生成逻辑却往往被封装在uuid这样的第三方库中。本文将带你从零实现四种不同格…...
解锁外语游戏新体验:XUnity自动翻译器完全指南 [特殊字符]
解锁外语游戏新体验:XUnity自动翻译器完全指南 🎮 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为外语游戏中的生涩文本而苦恼吗?XUnity自动翻译器让你轻松打破语…...
5个维度解决经典游戏兼容性痛点:DxWrapper的兼容性引擎创新价值
5个维度解决经典游戏兼容性痛点:DxWrapper的兼容性引擎创新价值 【免费下载链接】dxwrapper Fixes compatibility issues with older games running on Windows 10 by wrapping DirectX dlls. Also allows loading custom libraries with the file extension .asi i…...
批量视频加图片水印工具使用指南
软件简介批量视频加图片水印工具是一款桌面端视频水印批量添加工具,支持单张/多张水印、九宫格固定位置、四种随机位置模式、大小和透明度调节、时间间隔水印等功能。核心功能功能说明单张水印所有视频使用同一张水印图片多张随机水印从水印文件夹中随机选择水印图片…...
开源视频下载工具downkyi:高效管理B站资源的全流程指南
开源视频下载工具downkyi:高效管理B站资源的全流程指南 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&…...
提升90%效率:OpenCore EFI自动化配置工具OpCore-Simplify实战指南
提升90%效率:OpenCore EFI自动化配置工具OpCore-Simplify实战指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 副标题:面向…...
如何用Real-ESRGAN-ncnn-vulkan解决5种常见的图像质量问题?
如何用Real-ESRGAN-ncnn-vulkan解决5种常见的图像质量问题? 【免费下载链接】Real-ESRGAN-ncnn-vulkan NCNN implementation of Real-ESRGAN. Real-ESRGAN aims at developing Practical Algorithms for General Image Restoration. 项目地址: https://gitcode.co…...
springboot+vue基于web的大学生课程排课管理系统设计
目录 功能模块分析后台管理系统(SpringBoot)前端系统(Vue) 技术实现要点 项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 功能模块分析 后台管理系统(SpringBoot&…...
开源音频格式转换终极指南:ncmdumpGUI实现数字音乐资产自由流转的完整方案
开源音频格式转换终极指南:ncmdumpGUI实现数字音乐资产自由流转的完整方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 在数字音乐时代…...
ModelNet数据集高效下载与预处理实战指南
1. ModelNet数据集简介与下载技巧 ModelNet数据集是三维计算机视觉领域的经典基准数据集,由麻省理工学院CSAIL实验室于2015年发布。这个数据集最初是为了解决三维形状分类和检索问题而创建的,如今已成为点云处理、三维重建等研究的标配测试平台。 数据…...
