关于Sign in with Apple (Apple 登录) PHP的后端验证
1. 首先阅读官网文档 https://developer.apple.com/documentation/signinwithapplerestapi
重点讲解苹果授权登陆 后端PHP如何验证
1. identityToken 的验证:
客户端会向后端 传递 userId identityToken email 等参数
后端必须要验证 identityToken 的有效性,合法性;关于为什么要验证 可以阅读官方文档:
identityToken 是 JWT算法格式
使用到的Apple公钥接口:GET https://appleid.apple.com/auth/keys
返回如下:
{"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
需要使用n和e 生产公钥方法如下:
/**** Create a public key represented in PEM format from RSA modulus and exponent information** @param string $n the RSA modulus encoded in Base64* @param string $e the RSA exponent encoded in Base64* @return string the RSA public key represented in PEM format*/private static function createPemFromModulusAndExponent($n, $e){$modulus = JWT::urlsafeB64Decode($n);$publicExponent = JWT::urlsafeB64Decode($e);$components = array('modulus' => pack('Ca*a*', 2, self::encodeLength(strlen($modulus)), $modulus),'publicExponent' => pack('Ca*a*', 2, self::encodeLength(strlen($publicExponent)), $publicExponent));$RSAPublicKey = pack('Ca*a*a*',48,self::encodeLength(strlen($components['modulus']) + strlen($components['publicExponent'])),$components['modulus'],$components['publicExponent']);// sequence(oid(1.2.840.113549.1.1.1), null)) = rsaEncryption.$rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA$RSAPublicKey = chr(0) . $RSAPublicKey;$RSAPublicKey = chr(3) . self::encodeLength(strlen($RSAPublicKey)) . $RSAPublicKey;$RSAPublicKey = pack('Ca*a*',48,self::encodeLength(strlen($rsaOID . $RSAPublicKey)),$rsaOID . $RSAPublicKey);$RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" .chunk_split(base64_encode($RSAPublicKey), 64) .'-----END PUBLIC KEY-----';return $RSAPublicKey;}--------------------------------------------------------------
$pem = self::createPemFromModulusAndExponent($source['n'], $source['e']);
$pKey = openssl_pkey_get_public($pem);
$publicKeyDetails = openssl_pkey_get_details($pKey);return ['publicKey' => $publicKeyDetails['key'],'alg' => $parsedKeyData['alg']];
得到 $publicKeyDetails['key'] 这个公钥后 就可以使用它来 验证 identityToken的签名的合法性了:
$publicKey = $publicKeyData['publicKey'];
$alg = $publicKeyData['alg'];$payload = JWT::decode($identityToken, $publicKey, [$alg]);verify("$headb64.$bodyb64", $sig, $key, $header->alg)
-------------------------------------------------------
//verify中核心方法:
$success = openssl_verify($msg, $signature, $key, $algorithm);
identityToken:
'eyJraWQiOiJBSURPUEsxIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwczovL2FwcGxlaWQuYXBwbGUuY29tIiwiYXVkIjoiY29tLkxCTS5Wb2NhbE1hdGUiLCJleHAiOjE1NzIzMjA5MDUsImlhdCI6MTU3MjMyMDMwNSwic3ViIjoiMDAxMzA5LjI4Zjk0NGZkYjlhYjQ4YzliMGUyNTZlMDA5ZTZiOGIwLjA3MjIiLCJjX2hhc2giOiJTSUhWWE1QTjFibEJiN0RSZ2hYWjl3IiwiZW1haWwiOiJncWFjaWJ4eWh1QHByaXZhdGVyZWxheS5hcHBsZWlkLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjoidHJ1ZSIsImlzX3ByaXZhdGVfZW1haWwiOiJ0cnVlIiwiYXV0aF90aW1lIjoxNTcyMzIwMzA1fQ.RAXfYah9_owBatsmNTAMWD8eL1WXWO1quVetx1wMPqnZcr2DbrjHznL-g1LCxksIL0W3XuDMqxuU63ov_CXMVKFtHC86Bv6ab5p5CcIpIOGzRd5qnT7DrPDBV6JL822U09GubCbqZ22PD4m7wIRrggQ_V80GkHVH3M81TSJs6VAbTExjRg6RgFhofDWbMsT0h95b77jvTYbV1JzLRGgB1j6AE_CeMUKyGb3rSh0SGCkUX52IOJ2oCqQpB6dsZWS_90TJhCGyuHzfZHAhU7uRZoGvUVaIS212YhxqUvBozis3ZarEPYzGfCYlFMkLyduOvtPu_TEs_8hmljtNeFZZLw';解析后如下:HEADER:
{"kid": "AIDOPK1","alg": "RS256"
}PAYLOAD:{"iss": "https://appleid.apple.com","aud": "com.LBM.VocalMate","exp": 1572320905,"iat": 1572320305,"sub": "001309.28f944fdb9ab48c9b0e256e009e6b8b0.0722","c_hash": "SIHVXMPN1blBb7DRghXZ9w","email": "gqacibxyhu@privaterelay.appleid.com","email_verified": "true","is_private_email": "true","auth_time": 1572320305
}
完整的验证identityToken的代码可参考:https://github.com/GriffinLedingham/php-apple-signin
关于Sign in with Apple (Apple 登录) PHP的后端验证相关推荐
- ios 自架验证服务器,iOS 13-Sign In with Apple(苹果登录)APP+后端验证
关于Sign In with Apple的介绍就不讲了,直接进入正题吧! Certificates,IDs & Profiels->Keys->+号 1585892549402.j ...
- sign in with Apple,使用Apple授权登录
软件环境:Xcode 11.4.iOS13+ 创建时间:2020年 03月15号 更新时间:2021年 03月02号 这篇文章都说了什么 使用Apple登录的注意事项 接入原理概览 客户端编码 审核规 ...
- iOS开发:使用 Sign In With Apple(登录)用法以及注意事项
一.为什么要使用Sign in with Apple? 苹果在19年 9 月12 号更新了审核指南,加入 4.8 Sign in with Apple 一条,要求所有使用第三方登录 的 App,都必须 ...
- Apple 授权登录
如果使用了第三方登录(例如 Google auth), 那么 app store 就要求一定要使用 apple 授权登录, 否则上架会被拒绝 Guideline 4.8 - Design - Sign ...
- Apple ID 登录
Apple登录可以看做第三方登录的一种,即使用Apple ID登录,前提是你已经有了苹果开发者账号,直接进入主题吧. 添加App IDs 填写Bundle ID 勾选"Sign In wit ...
- apple授权登录(服务端)
一.apple配置 1.注册开发者 在apple开发者官网( https://developer.apple.com/)注册成开发者 2.创建应用 点击左边菜单的Certificates, Ident ...
- MAC重置密码时,使用Apple ID登录时 下发显示红字“连接到Apple ID”且点击下一步无反应
MAC重置密码时,使用Apple ID登录时 下发显示红字"连接到Apple ID"且点击下一步无反应 如图 处理办法 说明一下 如图 处理办法 确认是否连网: 在终端里输入&qu ...
- [Apple]通过Apple ID登录App时提示“共享”和“隐藏”邮件地址的问题
[Apple]通过Apple ID登录App时提示"共享"和"隐藏"邮件地址的问题 点击此处跳转 希望对您有所帮助.
- golang 苹果登录,服务端验证identityToken(真实有效)
介绍 2019年之后,对于Apple App来说,如果要支持第三方登录,则必须同时支持苹果的第三方登录,即Sign in With Apple, 本文主要介绍如何使用Go语言实现Sign in Wit ...
- 单点登录(前端+后端)
AccountController.java /** * 系统登录控制器 * * @version 1.0.0.0 */ @RestController @RequestMapping(&qu ...
最新文章
- Matlab中用GUI做计算器,怎样用MATLAB中的GUI做一个简单计算器
- matlab学习——1.基本操作
- RocketMQ NameServer网络通信架构(基于Netty)
- Collections接口下的Comparetor类和Comparable接口排序
- Vue中怎样引入Element
- Intellij IDEA -01 如何配置项目!
- php与Git下基于webhook的自动化部署
- dojo中的dojo/dom-construct
- VBScript自动打卡
- 达摩院成立XG实验室!阿里官宣进军5G
- 第五篇、常用的SQL语句和函数介绍
- No resource found that matches the given name 'android:Theme.Material.Light.DarkActionBar'
- 2021华为杯数学建模获奖经验分享
- 【机器人学】机器人开源项目KDL源码学习:(9)KDL中的内联函数
- 规则引擎Drools使用 第十一篇 Drools 的高级语法之LHS增强
- VS 2010 测试功能学习(七) - RnP与Coded UI自动化测试
- r语言爬虫数据html表格,如何用R语言爬取网页表格数据节省一天工作时间
- 华为交换机RRPP单环配置
- 华为OD机考 2022
- 未来10年计算机专业会不会淘汰,未来10年不会“被淘汰”的4个专业,发展潜力较大,就业前景可观...
热门文章
- 2021年12月西电大二Python期末小总结
- 极限中0除以常数_酶动力学中的一些常数简介
- 【微信公众号】7、SpringBoot整合WxJava新增临时、永久素材
- 案例7-1.3 寻找大富翁 (25分)
- 4/17 腾讯广州微信客户端开发一面
- 用 Mathematica 破解密码
- 未知usb设备(设备描述请求失败)_USB 之传输事务
- 浅谈使用KMeans进行性别与年龄的聚类分析
- 【工业】工业无线组网场景下的典型拓扑及设备解决方案
- excel小写转大写公式_Excel办公技巧:快速将单元格中小写字母全部转换为大写字母...