PHP接入Apple對access_token/identityToken進(jìn)行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 得到授權(quán)數(shù)據(jù) // authResult.access_token 與 appleInfo.identityToken 相同;authResult.openid 與 appleInfo.user 相同 // TODO: 登錄請求 }, fail: function(err) { console.log('三方登錄獲取登錄信息失敗', err) if (err.errCode === 1001) { // 登錄已取消 } else { // 其它錯誤情況 } } }) } else { // 當(dāng)前環(huán)境不支持該登錄方式 } }, fail: function(err) { console.log('獲取三方登錄信息異常', err) } })
示例 JWT:eyJhbGciOiAiUlMyNTYiLCJraWQiOiAiWXV5WG9ZIn0.
注意實際得到的 JWT 很長,但在驗證時只需要頭部分,所以我們可以先截取頭部分:
// 截取至第一個「點(diǎn)」的位置為 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);
獲取目標(biāo) Key
這里說的目標(biāo) Key 也就是 $keys
中用來解碼 JWT 的 Key,當(dāng)然你也許會想循環(huán) $keys
,這肯定不河里??!
最開始獲取的 $header
中包含了一個 kid
,而解析后的 $parsedKeys
中也存在對應(yīng) kid
值的一個鍵
所以我們可以直接判斷:
if (!($parsedKeys[$header['kid']] ?? null)) { throw new \Exception('JWT decode failed'); }
解碼獲取 OpenID
一定要捕獲異常,decode
方法會拋出 7 種不同的異常,有個簡單且友好的做法是單獨(dú)判斷過期異常并響應(yīng)友好提示
try { $decoded = \Firebase\JWT\JWT::decode($token, $parsedKeys[$header['kid']]); } catch (\Exception $e) { if ($e instanceof \Firebase\JWT\ExpiredException) { // 返回友好提示告知用戶授權(quán)過期 } // 可直接響應(yīng)登錄異?;騾?shù)異常 } // JWT 中 sub 即為 OpenID $openId = $decoded->sub;
多說兩句
- Apple 登錄授權(quán)后前端除了拿到
identityToken
還有一個user
也是OpenID
,但是該OpenID
不可信,可以在解碼 JWT 后進(jìn)行對比; - JWT 的有效期是 10 分鐘;
到此這篇關(guān)于PHP接入Apple對access_token/identityToken進(jìn)行JWT驗證流程詳解的文章就介紹到這了,更多相關(guān)PHP JWT驗證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PHP函數(shù)實現(xiàn)分頁含文本分頁和數(shù)字分頁
分頁功能是經(jīng)常使用的一個功能,因此用PHP實現(xiàn)分頁,文本分頁和數(shù)字分頁,對其以函數(shù)形式進(jìn)行了封裝2014-10-10php中substr()函數(shù)參數(shù)說明及用法實例
這篇文章主要介紹了php中substr()函數(shù)參數(shù)說明及用法,以實例形式深入分析了substr()函數(shù)中的各個參數(shù)的含義,并舉例說明了其對應(yīng)的用法,需要的朋友可以參考下2014-11-11mod_php、FastCGI、PHP-FPM等PHP運(yùn)行方式對比
這篇文章主要介紹了mod_php、FastCGI、PHP-FPM等PHP運(yùn)行方式對比,本文講解了什么是PHP處理器(PHP handlers)、mod_php的優(yōu)缺點(diǎn)、FastCGI的優(yōu)缺點(diǎn)、PHP-FPM(FastCGI Process Manager)的優(yōu)缺點(diǎn)等內(nèi)容,需要的朋友可以參考下2015-07-07