详细配置参考: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文件由三部分组成:
  1. Header
  2. Payload
  3. 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后端接口)相关推荐

  1. Apple Sign in with Apple(苹果授权登录PHP)

    Apple Sign in with Apple(苹果授权登录PHP) 文章目录 Apple Sign in with Apple(苹果授权登录PHP) 一.登录Apple Developer 二.创 ...

  2. Sign in With Apple (苹果授权登录)

    Sign in With Apple (苹果授权登录) 关于Sign in With Apple (苹果授权登录)的问题,公司app上架appStore被拒原因是使用第三方授权登陆但是却没有使用苹果账 ...

  3. 苹果授权登录Sign In With Apple亲测通过版[100%成功]

    苹果授权登录Sign In With Apple后台代码实现JAVA版本亲测通过版 废话不多说,直接复制把自己的包名写上就可以用了 有个别的小坑,HttpUtil自己写,没附上 Base64一定要用o ...

  4. iOS 苹果授权登录(Sign in with Apple)

    在 iOS13 中,如果 App 提供第三方登录,就必须添加 苹果登录 Sign in with Apple 选项,并要求所有开发者于 2020年4月之前 完成现有应用的更新,否则审核不给通过. iO ...

  5. iOS 苹果授权登录(Sign in with Apple)系列之Apple Developer配置篇

    原文 在 iOS13 中,如果 App 提供第三方登录,就必须添加 苹果登录 Sign in with Apple 选项,并要求所有开发者于 2020年4月之前 完成现有应用的更新,否则审核不给通过. ...

  6. 苹果apple账号授权登录第三方APP

    Apple官方文档 前言:由于公司最近有个业务需求是要进行Apple账号授权登录,于是我看边看文档边借鉴其他人的写法,发现好多文章都有一个共性,一个是在解析JWT的时候自己设置参数后进行判断,这样做没 ...

  7. 【JAVA】对接苹果授权登录流程

    背景 苹果公司要求所有使用第三方登录的 App,都必须接入Sign in with Apple. 接入方式 基于JWT identityToken的算法验证 基于授权码的验证 校验流程 上图为苹果对接 ...

  8. 苹果授权登录 jwt node 解码

    苹果授权登录 jwt node 解码 const jwt_decode = require('jwt-decode') const NodeRSA = require('node-rsa'); con ...

  9. 苹果授权登录(Apple sign in)Java服务端验证通过

    不得提一嘴,苹果的开发者文档写的真不怎么样,可能是我英语水平比较菜吧... 这里只介绍基于JWT的算法的验证方式,据说基于授权码的后端验证比较麻烦,csdn上有位老哥也许是老弟搞了几天都没成功!话说回 ...

最新文章

  1. Linux数据报文接收发送总结4
  2. Android开发学习笔记(10):NDK安装手顺及应用
  3. arm-none-eabi-gcc 嵌入式交叉编译器安装 极简教程
  4. html中加减号怎么输入,jQuery 实现点击加减号改变input标签中的value值,该怎么解决...
  5. MySQL Spatial Analysis Functions(空间计算方法)
  6. selenium+python自动化测试系列(二):AutoIt工具实现本地文件上传
  7. [ZigBee] 10、ZigBee之睡眠定时器
  8. C++11多线程std::thread的简单使用
  9. Python实现批量Word转PDF
  10. Mujoco-一阶单摆建模与控制
  11. 计算机制图基本知识6,机械制图基础知识
  12. Android中的AOP编程之AspectJ实战实现数据埋点
  13. HTML+CSS+JS零食官网网站设计——美食零食官网(6页) html网页制作期末美食作业成品_小吃类网页设计期末作业
  14. bt设置指定的ip地址
  15. 一个工科研究生毕业后的职业规划
  16. Excel技能培训之十六自动高亮重复值,满足条件的值,自定义高亮条件,自动高亮前三名,显示数据条,色阶
  17. 立创EDA使用记录——使用技巧和问题记录
  18. 外企面试最常见的八大英文问题
  19. 使用meb工具在线热备,将单实例切换为主从
  20. 计算机选取多个目标按什么键,连续选择多个按什么键

热门文章

  1. linux中写crontab脚本,Linux中crond服务与crontab用法
  2. ios 设计模式备忘录(1)
  3. 大股东猛买流通股----后G时代的机会(1)
  4. 微信小程序 选项卡(数据双层循环)
  5. 设计模式整理(人人都懂设计模式)
  6. 网络招聘陷入烧钱恶战 智联寄望1亿美元新融资
  7. 老鬼微信机器人HttpApi接口之消息接收
  8. Aspose.Slides For .Net v19.6有哪些功能亮点?我们用示例说话!
  9. EA9103D是为便携式射频和无线应用电源;EA4021是一个高度集成的16V1A1-CellLi-离子/Li-Iron线性电池充电器;EA4022是一个高度集成的16V1A2-Cells锂离子/Li
  10. ChatGPT的朋友们:大语言模型经典论文一次读到吐