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的后端验证相关推荐

  1. ios 自架验证服务器,iOS 13-Sign In with Apple(苹果登录)APP+后端验证

    关于Sign In with Apple的介绍就不讲了,直接进入正题吧! Certificates,IDs & Profiels->Keys->+号 1585892549402.j ...

  2. sign in with Apple,使用Apple授权登录

    软件环境:Xcode 11.4.iOS13+ 创建时间:2020年 03月15号 更新时间:2021年 03月02号 这篇文章都说了什么 使用Apple登录的注意事项 接入原理概览 客户端编码 审核规 ...

  3. iOS开发:使用 Sign In With Apple(登录)用法以及注意事项

    一.为什么要使用Sign in with Apple? 苹果在19年 9 月12 号更新了审核指南,加入 4.8 Sign in with Apple 一条,要求所有使用第三方登录 的 App,都必须 ...

  4. Apple 授权登录

    如果使用了第三方登录(例如 Google auth), 那么 app store 就要求一定要使用 apple 授权登录, 否则上架会被拒绝 Guideline 4.8 - Design - Sign ...

  5. Apple ID 登录

    Apple登录可以看做第三方登录的一种,即使用Apple ID登录,前提是你已经有了苹果开发者账号,直接进入主题吧. 添加App IDs 填写Bundle ID 勾选"Sign In wit ...

  6. apple授权登录(服务端)

    一.apple配置 1.注册开发者 在apple开发者官网( https://developer.apple.com/)注册成开发者 2.创建应用 点击左边菜单的Certificates, Ident ...

  7. MAC重置密码时,使用Apple ID登录时 下发显示红字“连接到Apple ID”且点击下一步无反应

    MAC重置密码时,使用Apple ID登录时 下发显示红字"连接到Apple ID"且点击下一步无反应 如图 处理办法 说明一下 如图 处理办法 确认是否连网: 在终端里输入&qu ...

  8. [Apple]通过Apple ID登录App时提示“共享”和“隐藏”邮件地址的问题

    [Apple]通过Apple ID登录App时提示"共享"和"隐藏"邮件地址的问题 点击此处跳转 希望对您有所帮助.

  9. golang 苹果登录,服务端验证identityToken(真实有效)

    介绍 2019年之后,对于Apple App来说,如果要支持第三方登录,则必须同时支持苹果的第三方登录,即Sign in With Apple, 本文主要介绍如何使用Go语言实现Sign in Wit ...

  10. 单点登录(前端+后端)

    AccountController.java /**  * 系统登录控制器  *  * @version 1.0.0.0  */ @RestController @RequestMapping(&qu ...

最新文章

  1. Matlab中用GUI做计算器,怎样用MATLAB中的GUI做一个简单计算器
  2. matlab学习——1.基本操作
  3. RocketMQ NameServer网络通信架构(基于Netty)
  4. Collections接口下的Comparetor类和Comparable接口排序
  5. Vue中怎样引入Element
  6. Intellij IDEA -01 如何配置项目!
  7. php与Git下基于webhook的自动化部署
  8. dojo中的dojo/dom-construct
  9. VBScript自动打卡
  10. 达摩院成立XG实验室!阿里官宣进军5G
  11. 第五篇、常用的SQL语句和函数介绍
  12. No resource found that matches the given name 'android:Theme.Material.Light.DarkActionBar'
  13. 2021华为杯数学建模获奖经验分享
  14. 【机器人学】机器人开源项目KDL源码学习:(9)KDL中的内联函数
  15. 规则引擎Drools使用 第十一篇 Drools 的高级语法之LHS增强
  16. VS 2010 测试功能学习(七) - RnP与Coded UI自动化测试
  17. r语言爬虫数据html表格,如何用R语言爬取网页表格数据节省一天工作时间
  18. 华为交换机RRPP单环配置
  19. 华为OD机考 2022
  20. 未来10年计算机专业会不会淘汰,未来10年不会“被淘汰”的4个专业,发展潜力较大,就业前景可观...

热门文章

  1. 2021年12月西电大二Python期末小总结
  2. 极限中0除以常数_酶动力学中的一些常数简介
  3. 【微信公众号】7、SpringBoot整合WxJava新增临时、永久素材
  4. 案例7-1.3 寻找大富翁 (25分)
  5. 4/17 腾讯广州微信客户端开发一面
  6. 用 Mathematica 破解密码
  7. 未知usb设备(设备描述请求失败)_USB 之传输事务
  8. 浅谈使用KMeans进行性别与年龄的聚类分析
  9. 【工业】工业无线组网场景下的典型拓扑及设备解决方案
  10. excel小写转大写公式_Excel办公技巧:快速将单元格中小写字母全部转换为大写字母...