apple登录服务端验证

Sign In With Apple 从登陆到服务器验证

  • 服务端向苹果请求验证
    手机端需要提交 user 、authorizationCode 、 identityToken 字段信息(code和token字段苹果返回的是 base64 Data 形式,手机端可以先转换 base64 字符串之后在给服务器)到服务器。然后服务器通过 https://appleid.apple.com/auth/token 该接口,并拼接对应参数去验证,接口相关信息苹果有提供 Generate and validate tokens 。参考链接:https://developer.apple.com/documentation/sign_in_with_apple/generate_and_validate_tokens
    下面着重介绍几个参数及其获取方法。首先先看下该接口需要的参数,如下:

    client_id: string (Required) (Authorization and Validation) The application identifier for your appclient_secret: string (Required) (Authorization and Validation) A secret generated as a JSON Web Token that uses the secret key generated by the WWDR portal.code: string (Authorization) The authorization code received from your application’s user agent. The code is single use only and valid for five minutes.grant_type: string (Required) (Authorization and Validation) The grant type that determines how the client interacts with the server. For authorization code validation, use authorization_code. For refresh token validation requests, use refresh_token.refresh_token: string (Validation) The refresh token received during the authorization request.redirect_uri: string (Authorization) The destination URI the code was originally sent to.
    

    其中 client_id 为app的 bundle identifier , code 即为手机端获取到的 authorizationCode 信息, grant_type 传入固定字符串 authorization_code 即可。还剩下一个必要参数 client_secret 那么这个参数相对麻烦点,需要我们自己生成。client_secret参数是一个JWT,singature部分使用非对称加密 RSASSA【RSA签名算法】 和 ECDSA【椭圆曲线数据签名算法】。
    生成 client_secret 之前,我们需要做如下工作

    • 获取 APP 的 bundleID
    • 获取开发者账号的TeamID
      在这里插入图片描述
    • 创建 privateKey,获取到 Key ID 和 私钥
      在这里插入图片描述
      创建完之后把私钥下载下来,并保存好,注意,私钥只能下载一次。
  • 生成client_secret

    {
    //首先composer编译加载"lcobucci/jwt": "^3.4"
    "require": {"facebook/graph-sdk": "^5.7", //facebook"lcobucci/jwt": "^3.4"//apple
    }
    //然后拼凑参数生成jwt格式密钥
    $payload = array("iss" => 'XXXX',//开发者账号的TeamID"aud" => "https://appleid.apple.com","iat" => time(),"sub" => 'XXXX',//bundle id"exp" => time()+ 86400*180);$jwt_header = array('typ' => 'JWT','alg' => 'ES256','kid' => 'XXXX',//上面截图的keyId
    );$key_path = 'XXXX';//下载的私钥文件,此文件为.p8结尾的文件
    $signer = new Lcobucci\JWT\Signer\Ecdsa\Sha256();
    $key = new Lcobucci\JWT\Signer\Key($key_path);
    $builder = new Lcobucci\JWT\Builder();
    $builder->sign($signer, $key);
    foreach($jwt_header as $key => $value)$builder->withHeader($key, $value);
    foreach($payload as $key => $value)$builder->withClaim($key, $value);
    $jwt_token = $builder->getToken();
    $jwt = (string)$jwt_token;//此jwt就为生成的client_secret//接下来就是拼凑请求参数
    $appleConfig = array();
    $appleConfig['client_id'] = 'XXXX;//bundle id
    $appleConfig['client_secret'] = $jwt;
    $appleConfig['code'] = $authorizationCode;//客户端获取的code
    $appleConfig['grant_type'] = 'authorization_code';//authorization_code,refresh_token
    $szUrl = 'https://appleid.apple.com/auth/token';
    $headers[]  =  "Content-Type:application/x-www-form-urlencoded";//设置请求头
    $curl = curl_init();
    //设置抓取的url
    curl_setopt($curl, CURLOPT_URL, $szUrl);
    //设置头文件的信息作为数据流输出
    curl_setopt($curl, CURLOPT_HEADER,0);
    //设置请求头
    curl_setopt($curl, CURLOPT_HTTPHEADER,$headers);
    //设置获取的信息以文件流的形式返回,而不是直接输出。
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    //设置post方式提交
    curl_setopt($curl, CURLOPT_POST, 1);
    //设置post数据
    $post_data = urldecode(http_build_query($appleConfig));
    curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
    //执行命令
    $response = curl_exec($curl);
    //关闭URL请求
    curl_close($curl);
    //返回结果
    $response = json_decode($response,true);
    
  • 返回结果如下

    {"access_token": "一个token,此处省略","token_type": "Bearer","expires_in": 3600,"refresh_token": "一个token,此处省略","id_token": "结果是JWT,字符串形式,此处省略"}
    

    参数解释看这个文档:https://developer.apple.com/documentation/sign_in_with_apple/tokenresponse

  • 服务器拿到相应结果,其中 id_token 也是 JWT 数据,decode 出 payload 部分如下
    在这里插入图片描述
    其中 aud 部分与你的app的bundleID一致, sub 部分即与手机端获得的 user 一致,服务器端通过对比 sub 字段信息是否与手机端上传的 user 信息一致来确定是否成功登录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/19037.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS 苹果登录(第三方登录)

Sign In with Apple是iOS 13的新增功能 所以现在苹果的app有第三方登录的功能需要加上苹果的登录(不然审核时会被拒掉) 一、证书文件配置 登录开发者账号,创建Bundle ID时 勾选 Sign In With Apple ,开启登录功能(勾…

Apple ID很久没有登录,使用邮件验证修改手机号的方法

背景:没有已登录的苹果设备 手机号已经更换 知道登录密码(不知道登录密码,在官网修改,也是通过邮件验证) 解决方法 1、登录账号和密码,会提示需要输入验证码。点击“未收到验证码” 2.点击第二项&#x…

Sign In with Apple - 使用苹果账号登录你的应用

编辑:老峰,作者:KANGZUBIN 来源:小专栏《WWDC19 内参》 苹果在 9 月 12 号更新了审核指南,加入 4.8 Sign in with Apple 一条,要求所有使用 第三方登录 的 App,都 必须接入 Sign in with Apple。…

IOS企业应用出现无法验证,需要网络连接以在这台iPad上验证。接入互联网并重试

这两天出现一个很奇怪的现象,IOS 13.5.1版本以上的系统安装应用时企业APP无法信任,但是IOS 13.5.1版本以下又可以信任。然后我做了以下操作之后就可以正常安装和信任了。 1.更换新的Development证书,原先的Development证书类型是Development&…

关于ipad:无法验证服务器身份

ipad 连接网络后,有时候会冒出这个弹窗,并且关掉后仍继续弹出 可以尝试以下几种方法:(我是用③解决的) ①. 确保你的iPad连接的是稳定的网络。有时候网络连接不稳定会导致无法验证服务器身份。 我们学校这个校园网…

Mirai登陆QQ的登陆验证过程

1.配置好一切,启动mirai进行登陆 设置好Bot的账号密码,启动项目 2.弹出如下弹窗,提示我们需要进行滑块验证 1.复制红框内的URL到浏览器打开 2.记得在加载完后按f12打开控制台 3.控制台切换到network/网络 3. 拖动滑动窗口,正确进行验证,观察控制台的响应 1.找到cap_union_new_…

iOS接入Google登录

目录 1.在Google Cloud后台配置客户端ID 2.iOS配置URL Types​编辑 3.代码实操 1.在Google Cloud后台配置客户端ID 首先要在 Google Cloud 中创建一个项目。新创建的Project需要先配置同意屏幕。一共有4步骤需要配置。 1.OAuth 同意屏幕 User Type选择"外部"进行创…

「超全!」谷歌大神 LeetCode 刷题笔记 PDF 分享

这是一本面向有C++编程基础,但缺乏刷题经验的读者的教科书和工具书(不适合完全的编程小白喔);同时,这是一本总结了15种常见类型题,50种细分类型题,101道题解的LeetCode刷题指南~ 作者高畅是谷歌无人车部门(Waymo)的工程师,从事计算机视觉和机器学习方向。 他在美国…

《LeetCode》—— 哈希

今天刷题讲解的主要讲的是关于——哈希这个知识点的题目讲解。 目录 (一)缺失的第一个正整数 (二)数组中只出现一次的两个数字 1、直接法 2、哈希 (三)直线上最多的点数 (一)缺…

文心一言 VS 讯飞星火 VS chatgpt (53)-- 算法导论6.2 5题

五、MAX-HEAPIFY的代码效率较高,但第 10 行中的递归调用可能例外,它可能使某些编译器产生低效的代码。请用循环控制结构取代递归,重写 MAX-HEAPIFY代码。 文心一言: 以下是使用循环控制结构取代递归调用的 MAX-HEAPIFY 代码&…

【Day18】LeetCode算法刷题[1694. 重新格式化电话号码 ] [202.快乐数]

刷题打卡,第十八天 题目一、1694. 重新格式化电话号码题目二、202.快乐数 题目一、1694. 重新格式化电话号码 原题链接:1694. 重新格式化电话号码 题目描述: 给你一个字符串形式的电话号码 number 。number 由数字、空格 、和破折号 - 组…

List解答LeetCode杨辉三角

作者:月亮嚼成星~ 博客主页:月亮嚼成星~的博客主页 专栏:数据结构与算法 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网 点击免费注册和我一起刷题吧 目录 了解杨辉三角 题目要求: 解答思…

张朝阳开课手推E=mc²,李永乐现场狂做笔记!CEO当太久都忘了他是MIT物理博士...

晓查 萧箫 明敏 鱼羊 发自 凹非寺量子位 | 公众号 QbitAI 张朝阳当物理老师还真是当上瘾了。 刚刚直接完成了一场线下课,当场手推质能方程,一整面黑板墙都差点没盛下。 这个姿势,是不是有你大物老师内范儿了(手动狗头)…

文心一言 VS 讯飞星火 VS chatgpt (25)-- 算法导论4.2 7题

七、设计算法,仅使用三次实数乘法即可完成复数 abi和cdi 相乘。算法需接收a、b、c和d 为输入,分别生成实部 ac-bd 和虚部adbc。 文心一言: 可以使用如下算法来计算复数 abi 和 cdi 的积,且只需进行三次实数乘法: 1.…

文心一言 VS 讯飞星火 VS chatgpt (24)-- 算法导论4.2 6题

六、用Strassen 算法作为子进程来进行一个 knn 矩阵和一个nkn 矩阵相乘,最快需要花费多长时间?对两个输入矩阵规模互换的情况,回答相同的问题。 文心一言: Strassen 算法是一种用于矩阵乘法的分治算法,它将原始的矩阵分解为较小…

文心一言 VS 讯飞星火 VS chatgpt (41)-- 算法导论5.4 5题

五、在大小为n的集合中,一个k字符串构成一个k排列的概率是多少?这个问题和生日悖论有什么关系? 文心一言: 在大小为n的集合中,一个k字符串构成一个k排列的概率是1/k!,这是由于排列的总数是k!,而每个字符串被选中的…

文心一言 VS 讯飞星火 VS chatgpt (18)-- 算法导论4.1 5题

五、使用如下思想为最大子数组问题设计一个非递归的、线性时间的算法。从数组的左边界开始,由左至右处理,记录到目前为止已经处理过的最大子数组。若已知 A[1…j]门的最大子数组,基于如下性质将解扩展为 A[1…j1]的最大子数组:A[1…j1]的最大…

张朝阳开课手推E=mc²,李永乐现场狂做笔记!CEO当太久都忘了他是MIT物理博士

张朝阳当物理老师还真是当上瘾了。 刚刚直接完成了一场线下课,当场手推质能方程,一整面黑板墙都差点没盛下。 这个姿势,是不是有你大物老师内范儿了(手动狗头)。 ‍没地方继续推导了,擦黑板前还要感慨一句…

AI 绘画 - 建筑绘图辅助设计之 SD 基础

前情提要 如果你想学会一门东西,那么就给交给自己一个明确的任务,然后独立完成,之后我们就可以掌握这门技术了; 简介 SD建筑绘画主要目的是将建筑概念转化为可视化的表达形式,以便更好地传达设计理念给业主、团队成…

AI 绘画 - 建筑绘图辅助设计之模型训练

前情提要 2023-06-18 周日 杭州 小雨 小记: 昨天搞的好累,10点左右就想着先躺一会儿,然后就睡过去了,很奇怪,如果进行 AI 绘画,晚上就会做很奇怪的梦,说不上来的那种感觉,就是莫名的不舒服。 …