PHP接入Apple對(duì)access_token/identityToken進(jìn)行JWT驗(yàn)證流程詳解
需用到 Composer 庫(kù):firebase/php-jwt,直接安裝即可 composer require firebase/php-jwt
解析 JWT 頭
簡(jiǎn)單示例下 UniApp 中通過(guò) 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('三方登錄獲取用戶(hù)信息成功', authed)
// Apple 登錄這兒可用 authed.authResult 或 authed.appleInfo 得到授權(quán)數(shù)據(jù)
// authResult.access_token 與 appleInfo.identityToken 相同;authResult.openid 與 appleInfo.user 相同
// TODO: 登錄請(qǐng)求
},
fail: function(err) {
console.log('三方登錄獲取登錄信息失敗', err)
if (err.errCode === 1001) {
// 登錄已取消
} else {
// 其它錯(cuò)誤情況
}
}
})
} else {
// 當(dāng)前環(huán)境不支持該登錄方式
}
},
fail: function(err) {
console.log('獲取三方登錄信息異常', err)
}
})示例 JWT:eyJhbGciOiAiUlMyNTYiLCJraWQiOiAiWXV5WG9ZIn0.
注意實(shí)際得到的 JWT 很長(zhǎng),但在驗(yàn)證時(shí)只需要頭部分,所以我們可以先截取頭部分:
// 截取至第一個(gè)「點(diǎn)」的位置為 JWT 頭 $header = json_decode(base64_decode(substr($token, 0, strpos($token, '.'))), true);
獲取 Apple 公鑰
公鑰可以直接通過(guò)接口獲?。?a rel="external nofollow" target="_blank">https://appleid.apple.com/auth/keys
因?yàn)椴淮嬖谧兓?,建議首次獲取后解碼 $keys = json_decode($keys, true) 并緩存,下次直接從緩存中拿取
解析$keys(公鑰)
這里就需要使用安裝的 Composer 庫(kù)了:
$parsedKeys = \Firebase\JWT\JWK::parseKeySet($keys, true);
獲取目標(biāo) Key
這里說(shuō)的目標(biāo) Key 也就是 $keys 中用來(lái)解碼 JWT 的 Key,當(dāng)然你也許會(huì)想循環(huán) $keys,這肯定不河里??!
最開(kāi)始獲取的 $header 中包含了一個(gè) kid,而解析后的 $parsedKeys 中也存在對(duì)應(yīng) kid 值的一個(gè)鍵
所以我們可以直接判斷:
if (!($parsedKeys[$header['kid']] ?? null)) {
throw new \Exception('JWT decode failed');
}
解碼獲取 OpenID
一定要捕獲異常,decode 方法會(huì)拋出 7 種不同的異常,有個(gè)簡(jiǎn)單且友好的做法是單獨(dú)判斷過(guò)期異常并響應(yīng)友好提示
try {
$decoded = \Firebase\JWT\JWT::decode($token, $parsedKeys[$header['kid']]);
} catch (\Exception $e) {
if ($e instanceof \Firebase\JWT\ExpiredException) {
// 返回友好提示告知用戶(hù)授權(quán)過(guò)期
}
// 可直接響應(yīng)登錄異?;騾?shù)異常
}
// JWT 中 sub 即為 OpenID
$openId = $decoded->sub;
多說(shuō)兩句
- Apple 登錄授權(quán)后前端除了拿到
identityToken還有一個(gè)user也是OpenID,但是該OpenID不可信,可以在解碼 JWT 后進(jìn)行對(duì)比; - JWT 的有效期是 10 分鐘;
到此這篇關(guān)于PHP接入Apple對(duì)access_token/identityToken進(jìn)行JWT驗(yàn)證流程詳解的文章就介紹到這了,更多相關(guān)PHP JWT驗(yàn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
php實(shí)現(xiàn)根據(jù)url自動(dòng)生成縮略圖的方法
這篇文章主要介紹了php實(shí)現(xiàn)根據(jù)url自動(dòng)生成縮略圖的方法,詳細(xì)講述了相關(guān)庫(kù)的使用、配置文件寫(xiě)法及類(lèi)文件的用法示例,需要的朋友可以參考下2014-09-09
PHP 獲取文件路徑(靈活應(yīng)用__FILE__)
__FILE__ ,是返回文件的完整路徑和文件名。如果用在包含文件中,則返回包含文件名。自 PHP 4.0.2 起,__FILE__ 總是包含一個(gè)絕對(duì)路徑,而在此之前的版本有時(shí)會(huì)包含一個(gè)相對(duì)路徑2013-02-02
解決FastCGI 進(jìn)程超過(guò)了配置的活動(dòng)超時(shí)時(shí)限的問(wèn)題
本篇文章是對(duì)解決FastCGI 進(jìn)程超過(guò)了配置的活動(dòng)超時(shí)時(shí)限的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07
php使用cookie保存用戶(hù)登錄的用戶(hù)名實(shí)例
這篇文章主要介紹了php使用cookie保存用戶(hù)登錄的用戶(hù)名實(shí)現(xiàn)方法,實(shí)例形式完整分析了cookie保存用戶(hù)登錄名的技巧,需要的朋友可以參考下2015-01-01

