PHP 接入 Apple 登录对 access_token/identityToken 进行 JWT 验证
需用到 Composer 库:firebase/php-jwt
,直接安装即可 composer require firebase/php-jwt
解析 JWT 头
简单示例下 UniApp 中通过 uni.login()
方法获取 JWT
let type = 'apple'uni.getProvider({service: 'oauth',success: function(res) {if (res.provider.includes(type)) {uni.login({provider: type,success: function(authed) {console.log('三方登录获取用户信息成功', authed)// Apple 登录这儿可用 authed.authResult 或 authed.appleInfo 得到授权数据// authResult.access_token 与 appleInfo.identityToken 相同;authResult.openid 与 appleInfo.user 相同// TODO: 登录请求},fail: function(err) {console.log('三方登录获取登录信息失败', err)if (err.errCode === 1001) {// 登录已取消} else {// 其它错误情况}}})} else {// 当前环境不支持该登录方式}},fail: function(err) {console.log('获取三方登录信息异常', err)}
})
示例 JWT:eyJhbGciOiAiUlMyNTYiLCJraWQiOiAiWXV5WG9ZIn0.
注意实际得到的 JWT 很长,但在验证时只需要头部分,所以我们可以先截取头部分:
// 截取至第一个「点」的位置为 JWT 头
$header = json_decode(base64_decode(substr($token, 0, strpos($token, '.'))), true);
获取 Apple 公钥
公钥可以直接通过接口获取:https://appleid.apple.com/auth/keys
因为不存在变化,建议首次获取后解码 $keys = json_decode($keys, true)
并缓存,下次直接从缓存中拿取
解析 $keys
(公钥)
这里就需要使用安装的 Composer 库了:
$parsedKeys = \Firebase\JWT\JWK::parseKeySet($keys, true);
获取目标 Key
这里说的目标 Key 也就是 $keys
中用来解码 JWT 的 Key,当然你也许会想循环 $keys
,这肯定不河里啊!
最开始获取的 $header
中包含了一个 kid
,而解析后的 $parsedKeys
中也存在对应 kid
值的一个键
所以我们可以直接判断:
if (!($parsedKeys[$header['kid']] ?? null)) {throw new \Exception('JWT decode failed');
}
解码获取 OpenID
一定要捕获异常,decode
方法会抛出 7 种不同的异常,有个简单且友好的做法是单独判断过期异常并响应友好提示
try {$decoded = \Firebase\JWT\JWT::decode($token, $parsedKeys[$header['kid']]);
} catch (\Exception $e) {if ($e instanceof \Firebase\JWT\ExpiredException) {// 返回友好提示告知用户授权过期}// 可直接响应登录异常或参数异常
}// JWT 中 sub 即为 OpenID
$openId = $decoded->sub;
多说两句
- Apple 登录授权后前端除了拿到
identityToken
还有一个user
也是OpenID
,但是该OpenID
不可信,可以在解码 JWT 后进行对比; - JWT 的有效期是 10 分钟;
PHP 接入 Apple 登录对 access_token/identityToken 进行 JWT 验证相关推荐
- Unity:Firebase接入Apple登录
Unity:Firebase接入Apple登录 开启Firebase的登录方式 设置Apple的后台信息 从Assets Store下载 Singn In With Apple Xcode设置 添加A ...
- Unity 接入Apple登录
文章末尾有资源插件链接 在6月的全球开发者大会(WWDC)上,苹果宣布了一款新产品:使用苹果登录.随着iOS 13即将于9月19日发布,苹果已经更新了App Store审查指南,现在他们要求任何使用第 ...
- 接入Apple 登录(AuthenticationServices) 后端处理Java版
1. 查看苹果官方文档 https://developer.apple.com/cn/documentation/authenticationservices/implementing_user_au ...
- (vue + SpingBoot)前后端分离实现Apple登录的过程
前言 首先介绍一下为什么写这篇文章.最近,公司有一个项目,是海外的手机游戏想要上到云平台上供各种客户端(web,Android,ios等)可以无需下载游戏即可游玩.其中我负责web端的项目,项目需要接 ...
- Unity Apple登录接入
Unity Apple登录接入 引言 在2019年6月份的全球开发者大会(WWDC)上,苹果宣布了一款新产品:Sign In With Apple.随后苹果更新了App Store审查指南,现在他们要 ...
- 详解如何进行第三方App接入微信登录
微信登录接入 微信登录遵循协议Aouth2.0中的授权码模式 我们来看一下Aouth2.0中的授权码模式是怎么定义的: 授权码模式(authorization code)是功能最完整.流程最严密的授权 ...
- .netcore 极速接入第三方登录
新年新气象,趁着新年的喜庆,肝了十来天,终于发了第一版,希望大家喜欢. 如果有不喜欢看文字的童鞋,可以直接看下面的地址体验一下: Github: https://github.com/mrhuo/Mr ...
- iOS apple 登录
Handle User Credentials 使用场景: 点击apple登录, 成功后, 使用user等信息传给服务器验证 sign in with Apple #import <Authen ...
- apicloud——微信第三方登录、apple登录
apicloud中微信第三方登录的问题 混合开发移动应用很火啊现在,多数公司都要求是必备技能,或者加分技能,所以学习来了 如下是作为前端工作者应该了解的内容,更加详细的前往官方示例 *** 结合api ...
最新文章
- asp.net mvc 3 unobtrusive client side validation not working in IE
- mysql 对多列进行排序 分组_数据库的多列分组
- [Linux]core文件调试方法
- 如何删除tmp计算机桌面,Win10系统中tmp文件删除不了应该如何解决?
- WPF中的Attached Property
- 维特比算法—打字输入预测
- 有关提高visual studio开发效率的方法
- 宋利:许多高手并未参加MSU评测
- 无人值守网络安装Linux
- VideoUrlParser视频信息分析
- Java中各种对象的各种实例化方式
- JUST——简单转换下的JSON
- (C语言)验证哥德巴赫猜想,输入一个大于6的偶数,输出这个数能被分解为哪两个质数的和
- Python多处理示例
- 背包问题回溯法c语言程序,C语言回溯法解决背包问题
- python header是啥_Python爬虫之Header
- Nofollow标签的写法以及nofollow使用介绍
- JVM源码分析之wait()和notify()
- 间断点怎么求?——6个例子来详细解析较难的间断点的求法
- UT单元测试总结实践篇
热门文章
- Android10源码AOSP(从Ubuntu14.04环境搭建到下载编译运行)
- php随机生成昵称,使用PHP批量生成随机用户名
- 解决阿里巴巴JSONObject工具 com.alibaba.fastjson.JSONObject cannot be cast to 的问题
- 移动应用程序设计基础——数据库实践——简单日记本
- 什么是数据结构?什么是算法
- 旷视研究院获得 ECCV SSLAD 双赛道冠军
- 基于内容推荐算法html,基于内容的互联网推荐算法
- 国密SSL证书正式上线,知道创宇云防御助力金融和重要领域完成国密升级改造...
- 梯田油菜花海距杭州仅120公里
- The Independent JPEG Group‘s JPEG software