91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP怎么接入Apple對access_token/identityToken進行JWT驗證

發布時間:2022-09-28 14:31:44 來源:億速云 閱讀:157 作者:iii 欄目:開發技術

這篇文章主要講解了“PHP怎么接入Apple對access_token/identityToken進行JWT驗證”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“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驗證”的內容了,經過本文的學習后,相信大家對PHP怎么接入Apple對access_token/identityToken進行JWT驗證這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永靖县| 财经| 邵东县| 蓝山县| 泗洪县| 武宁县| 炎陵县| 万全县| 济宁市| 阿拉善左旗| 邵武市| 胶南市| 德保县| 府谷县| 大洼县| 喀喇| 留坝县| 辰溪县| 恩施市| 贵溪市| 呼伦贝尔市| 孟连| 巴里| 方山县| 噶尔县| 安达市| 房山区| 防城港市| 锦州市| 南江县| 古浪县| 漠河县| 星座| 内丘县| 舟山市| 江安县| 卓尼县| 吐鲁番市| 河间市| 霍州市| 社会|