需用到 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;

多说两句

  1. Apple 登录授权后前端除了拿到 identityToken 还有一个 user 也是 OpenID,但是该 OpenID 不可信,可以在解码 JWT 后进行对比;
  2. JWT 的有效期是 10 分钟;

PHP 接入 Apple 登录对 access_token/identityToken 进行 JWT 验证相关推荐

  1. Unity:Firebase接入Apple登录

    Unity:Firebase接入Apple登录 开启Firebase的登录方式 设置Apple的后台信息 从Assets Store下载 Singn In With Apple Xcode设置 添加A ...

  2. Unity 接入Apple登录

    文章末尾有资源插件链接 在6月的全球开发者大会(WWDC)上,苹果宣布了一款新产品:使用苹果登录.随着iOS 13即将于9月19日发布,苹果已经更新了App Store审查指南,现在他们要求任何使用第 ...

  3. 接入Apple 登录(AuthenticationServices) 后端处理Java版

    1. 查看苹果官方文档 https://developer.apple.com/cn/documentation/authenticationservices/implementing_user_au ...

  4. (vue + SpingBoot)前后端分离实现Apple登录的过程

    前言 首先介绍一下为什么写这篇文章.最近,公司有一个项目,是海外的手机游戏想要上到云平台上供各种客户端(web,Android,ios等)可以无需下载游戏即可游玩.其中我负责web端的项目,项目需要接 ...

  5. Unity Apple登录接入

    Unity Apple登录接入 引言 在2019年6月份的全球开发者大会(WWDC)上,苹果宣布了一款新产品:Sign In With Apple.随后苹果更新了App Store审查指南,现在他们要 ...

  6. 详解如何进行第三方App接入微信登录

    微信登录接入 微信登录遵循协议Aouth2.0中的授权码模式 我们来看一下Aouth2.0中的授权码模式是怎么定义的: 授权码模式(authorization code)是功能最完整.流程最严密的授权 ...

  7. .netcore 极速接入第三方登录

    新年新气象,趁着新年的喜庆,肝了十来天,终于发了第一版,希望大家喜欢. 如果有不喜欢看文字的童鞋,可以直接看下面的地址体验一下: Github: https://github.com/mrhuo/Mr ...

  8. iOS apple 登录

    Handle User Credentials 使用场景: 点击apple登录, 成功后, 使用user等信息传给服务器验证 sign in with Apple #import <Authen ...

  9. apicloud——微信第三方登录、apple登录

    apicloud中微信第三方登录的问题 混合开发移动应用很火啊现在,多数公司都要求是必备技能,或者加分技能,所以学习来了 如下是作为前端工作者应该了解的内容,更加详细的前往官方示例 *** 结合api ...

最新文章

  1. asp.net mvc 3 unobtrusive client side validation not working in IE
  2. mysql 对多列进行排序 分组_数据库的多列分组
  3. [Linux]core文件调试方法
  4. 如何删除tmp计算机桌面,Win10系统中tmp文件删除不了应该如何解决?
  5. WPF中的Attached Property
  6. 维特比算法—打字输入预测
  7. 有关提高visual studio开发效率的方法
  8. 宋利:许多高手并未参加MSU评测
  9. 无人值守网络安装Linux
  10. VideoUrlParser视频信息分析
  11. Java中各种对象的各种实例化方式
  12. JUST——简单转换下的JSON
  13. (C语言)验证哥德巴赫猜想,输入一个大于6的偶数,输出这个数能被分解为哪两个质数的和
  14. Python多处理示例
  15. 背包问题回溯法c语言程序,C语言回溯法解决背包问题
  16. python header是啥_Python爬虫之Header
  17. Nofollow标签的写法以及nofollow使用介绍
  18. JVM源码分析之wait()和notify()
  19. 间断点怎么求?——6个例子来详细解析较难的间断点的求法
  20. UT单元测试总结实践篇

热门文章

  1. Android10源码AOSP(从Ubuntu14.04环境搭建到下载编译运行)
  2. php随机生成昵称,使用PHP批量生成随机用户名
  3. 解决阿里巴巴JSONObject工具 com.alibaba.fastjson.JSONObject cannot be cast to 的问题
  4. 移动应用程序设计基础——数据库实践——简单日记本
  5. 什么是数据结构?什么是算法
  6. 旷视研究院获得 ECCV SSLAD 双赛道冠军
  7. 基于内容推荐算法html,基于内容的互联网推荐算法
  8. 国密SSL证书正式上线,知道创宇云防御助力金融和重要领域完成国密升级改造...
  9. 梯田油菜花海距杭州仅120公里
  10. The Independent JPEG Group‘s JPEG software