PHP接入Apple对access_token/identityToken进行JWT验证流程详解

吾爱主题 阅读:140055 2022-11-22 16:02:00 评论:25

需用到 Composer 库:firebase/php-jwt,直接安装即可 composer require firebase/php-jwt

解析 JWT 头

简单示例下 UniApp 中通过 uni.login() 方法获取 JWT

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 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 很长,但在验证时只需要头部分,所以我们可以先截取头部分:

?
1 2 // 截取至第一个「点」的位置为 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 库了:

?
1 $parsedKeys = \Firebase\JWT\JWK::parseKeySet( $keys , true);

获取目标 Key

这里说的目标 Key 也就是 $keys 中用来解码 JWT 的 Key,当然你也许会想循环 $keys,这肯定不河里啊!

最开始获取的 $header 中包含了一个 kid,而解析后的 $parsedKeys 中也存在对应 kid 值的一个键

所以我们可以直接判断:

?
1 2 3 if (!( $parsedKeys [ $header [ 'kid' ]] ?? null)) {      throw new \Exception( 'JWT decode failed' ); }

解码获取 OpenID

一定要捕获异常,decode 方法会抛出 7 种不同的异常,有个简单且友好的做法是单独判断过期异常并响应友好提示

?
1 2 3 4 5 6 7 8 9 10 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验证流程详解的文章就介绍到这了,更多相关PHP JWT验证内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/maxsky/article/details/126904637

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容