php Sign in with Apple(苹果授权登录PHP后端接口)
详细配置参考:https://developer.okta.com/blog/2019/06/04/what-the-heck-is-sign-in-with-apple
本文主要参考:
- https://easeapi.com/blog/blog/88-sign-with-apple.html
- https://blog.csdn.net/wpf199402076118/article/details/99677412
APP客户端授权登录功能开发不做讲述,主要记录PHP后端如何验证苹果授权登录。
针对后端验证苹果提供了两种验证方式,一种是基于JWT的算法验证,另外一种是基于授权码的验证,本文使用了JWT验证实现。
首先,APP客户端认证成功后会返回ASAuthorizationAppleIDCredential类型的对象,它的主要属性如下:
- userID:授权的用户唯一标识,在一个开发者账户下的APP获取到的是一样的,类似微信开发API中的openid;
- email、fullName:授权的用户资料,用户邮箱,昵称等信息;
- authorizationCode:授权code
- identityToken:授权用户的JWT凭证,用于验证信息合法性
其次,拿到这些信息,将user,email,fullName,identityToken等信息直接传递给后端,后端对请求进行验证(此处使用identityToken进行JWT验证):
- identityTokenString实际上是JWT(JSON Web Token)格式的文件,JWT文件由三部分组成:
- Header
- Payload
- Signature
这三部分由"."分割,其中Header和Payload是经过base64编码的。
- 使用到的Apple公钥接口:https://appleid.apple.com/auth/keys
- 接口文档:https://developer.apple.com/documentation/signinwithapplerestapi/fetch_apple_s_public_key_for_verifying_token_signature
- 直接访问公钥接口地址返回公钥值:
{"keys": [{"kty": "RSA","kid": "AIDOPK1","use": "sig","alg": "RS256","n": "lxrwmuYSAsTfn-lUu4goZSXBD9ackM9OJuwUVQHmbZo6GW4Fu_auUdN5zI7Y1dEDfgt7m7QXWbHuMD01HLnD4eRtY-RNwCWdjNfEaY_esUPY3OVMrNDI15Ns13xspWS3q-13kdGv9jHI28P87RvMpjz_JCpQ5IM44oSyRnYtVJO-320SB8E2Bw92pmrenbp67KRUzTEVfGU4-obP5RZ09OxvCr1io4KJvEOjDJuuoClF66AT72WymtoMdwzUmhINjR0XSqK6H0MdWsjw7ysyd_JhmqX5CAaT9Pgi0J8lU_pcl215oANqjy7Ob-VMhug9eGyxAWVfu_1u6QJKePlE-w","e": "AQAB"}]
}
kid,为密钥id标识,签名算法采用的是RS256(RSA 256 + SHA 256),kty常量标识使用RSA签名算法,其公钥参数为n和e,其值采用了BASE64编码,使用时需要先解码。
然后引入JWT算法,下面是主要逻辑及验证接口:
/*** 第三方登录*/public function appleIdLogin(){$openid = $this->params('userID', '');$verifyToken = $this->params('verifyToken', '');if(empty($openid) || empty($verifyToken)){$this->responseJson(1, '参数错误', array(), true);}//token校验$verifyRes = $this->appleJwtVerify($verifyToken);if(isset($verifyRes['jwtStatus']) && $verifyRes['jwtStatus'] == 'failed'){$this->responseJson(1, $verifyRes['jwtMsg'], array(), true);return;}else{//进行注册$res = $this->register('appleID', $openid);}}/*** AppleID登录JWT校验identityToken* 解析后的identityToken由三部分组成:Header.Payload.Signature** @param string $identityToken* @return object* @throws \Exception*/private function appleJwtVerify($identityToken = ''){ //获取Apple公钥访问地址:https://appleid.apple.com/auth/keys//得到Apple公钥://{// "kty": "RSA",// "kid": "AIDOPK1",// "use": "sig",// "alg": "RS256",// "n": "lxrwmuYSAsTfn-lUu4goZSXBD9ackM9OJuwUVQHmbZo6GW4Fu_auUdN5zI7Y1dEDfgt7m7QXWbHuMD01HLnD4eRtY-RNwCWdjNfEaY_esUPY3OVMrNDI15Ns13xspWS3q-13kdGv9jHI28P87RvMpjz_JCpQ5IM44oSyRnYtVJO-320SB8E2Bw92pmrenbp67KRUzTEVfGU4-obP5RZ09OxvCr1io4KJvEOjDJuuoClF66AT72WymtoMdwzUmhINjR0XSqK6H0MdWsjw7ysyd_JhmqX5CAaT9Pgi0J8lU_pcl215oANqjy7Ob-VMhug9eGyxAWVfu_1u6QJKePlE-w",// "e": "AQAB"//}//通过Apple公钥在线(https://8gwifi.org/jwkconvertfunctions.jsp)得到用于解密的pem公钥字符串$publickKey = "-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlxrwmuYSAsTfn+lUu4go
ZSXBD9ackM9OJuwUVQHmbZo6GW4Fu/auUdN5zI7Y1dEDfgt7m7QXWbHuMD01HLnD
4eRtY+RNwCWdjNfEaY/esUPY3OVMrNDI15Ns13xspWS3q+13kdGv9jHI28P87RvM
pjz/JCpQ5IM44oSyRnYtVJO+320SB8E2Bw92pmrenbp67KRUzTEVfGU4+obP5RZ0
9OxvCr1io4KJvEOjDJuuoClF66AT72WymtoMdwzUmhINjR0XSqK6H0MdWsjw7ysy
d/JhmqX5CAaT9Pgi0J8lU/pcl215oANqjy7Ob+VMhug9eGyxAWVfu/1u6QJKePlE
+wIDAQAB
-----END PUBLIC KEY-----";//pem公钥 【也可以通过将RSA公钥modulus(N)和exponent(E)转换为PEM文件】$decoded = JWT::decode($identityToken, $publickKey, array('RS256'));return $decoded;}/*** 第三方登录账号注册** @param string $regType 注册类型* @param string $openid 账户唯一识别* @throws \Blim\Exception\Stop*/public function register($regType = '', $openid = ''){if(empty($regType) || empty($openid)){$this->responseJson(1, '注册失败', array(), true);}else{//注册逻辑}}/*** json输出* @param $code* @param string $message* @param array $exts* @param bool $hasData* @throws Stop*/public function responseJson($code, $message = '', $exts = array(), $hasData = false){$res = array('code' => $code, 'tips' => $message, 'msg' => $message);$res['data'] = array();if (!empty($exts)) {$res['data'] = $exts;}app('response')->withJson($res, 200);app()->stop();}
php Sign in with Apple(苹果授权登录PHP后端接口)相关推荐
- Apple Sign in with Apple(苹果授权登录PHP)
Apple Sign in with Apple(苹果授权登录PHP) 文章目录 Apple Sign in with Apple(苹果授权登录PHP) 一.登录Apple Developer 二.创 ...
- Sign in With Apple (苹果授权登录)
Sign in With Apple (苹果授权登录) 关于Sign in With Apple (苹果授权登录)的问题,公司app上架appStore被拒原因是使用第三方授权登陆但是却没有使用苹果账 ...
- 苹果授权登录Sign In With Apple亲测通过版[100%成功]
苹果授权登录Sign In With Apple后台代码实现JAVA版本亲测通过版 废话不多说,直接复制把自己的包名写上就可以用了 有个别的小坑,HttpUtil自己写,没附上 Base64一定要用o ...
- iOS 苹果授权登录(Sign in with Apple)
在 iOS13 中,如果 App 提供第三方登录,就必须添加 苹果登录 Sign in with Apple 选项,并要求所有开发者于 2020年4月之前 完成现有应用的更新,否则审核不给通过. iO ...
- iOS 苹果授权登录(Sign in with Apple)系列之Apple Developer配置篇
原文 在 iOS13 中,如果 App 提供第三方登录,就必须添加 苹果登录 Sign in with Apple 选项,并要求所有开发者于 2020年4月之前 完成现有应用的更新,否则审核不给通过. ...
- 苹果apple账号授权登录第三方APP
Apple官方文档 前言:由于公司最近有个业务需求是要进行Apple账号授权登录,于是我看边看文档边借鉴其他人的写法,发现好多文章都有一个共性,一个是在解析JWT的时候自己设置参数后进行判断,这样做没 ...
- 【JAVA】对接苹果授权登录流程
背景 苹果公司要求所有使用第三方登录的 App,都必须接入Sign in with Apple. 接入方式 基于JWT identityToken的算法验证 基于授权码的验证 校验流程 上图为苹果对接 ...
- 苹果授权登录 jwt node 解码
苹果授权登录 jwt node 解码 const jwt_decode = require('jwt-decode') const NodeRSA = require('node-rsa'); con ...
- 苹果授权登录(Apple sign in)Java服务端验证通过
不得提一嘴,苹果的开发者文档写的真不怎么样,可能是我英语水平比较菜吧... 这里只介绍基于JWT的算法的验证方式,据说基于授权码的后端验证比较麻烦,csdn上有位老哥也许是老弟搞了几天都没成功!话说回 ...
最新文章
- Linux数据报文接收发送总结4
- Android开发学习笔记(10):NDK安装手顺及应用
- arm-none-eabi-gcc 嵌入式交叉编译器安装 极简教程
- html中加减号怎么输入,jQuery 实现点击加减号改变input标签中的value值,该怎么解决...
- MySQL Spatial Analysis Functions(空间计算方法)
- selenium+python自动化测试系列(二):AutoIt工具实现本地文件上传
- [ZigBee] 10、ZigBee之睡眠定时器
- C++11多线程std::thread的简单使用
- Python实现批量Word转PDF
- Mujoco-一阶单摆建模与控制
- 计算机制图基本知识6,机械制图基础知识
- Android中的AOP编程之AspectJ实战实现数据埋点
- HTML+CSS+JS零食官网网站设计——美食零食官网(6页) html网页制作期末美食作业成品_小吃类网页设计期末作业
- bt设置指定的ip地址
- 一个工科研究生毕业后的职业规划
- Excel技能培训之十六自动高亮重复值,满足条件的值,自定义高亮条件,自动高亮前三名,显示数据条,色阶
- 立创EDA使用记录——使用技巧和问题记录
- 外企面试最常见的八大英文问题
- 使用meb工具在线热备,将单实例切换为主从
- 计算机选取多个目标按什么键,连续选择多个按什么键
热门文章
- linux中写crontab脚本,Linux中crond服务与crontab用法
- ios 设计模式备忘录(1)
- 大股东猛买流通股----后G时代的机会(1)
- 微信小程序 选项卡(数据双层循环)
- 设计模式整理(人人都懂设计模式)
- 网络招聘陷入烧钱恶战 智联寄望1亿美元新融资
- 老鬼微信机器人HttpApi接口之消息接收
- Aspose.Slides For .Net v19.6有哪些功能亮点?我们用示例说话!
- EA9103D是为便携式射频和无线应用电源;EA4021是一个高度集成的16V1A1-CellLi-离子/Li-Iron线性电池充电器;EA4022是一个高度集成的16V1A2-Cells锂离子/Li
- ChatGPT的朋友们:大语言模型经典论文一次读到吐