Sign in with Apple 服務(wù)端驗(yàn)證(nodejs 版)

本篇主要內(nèi)容是將如何在服務(wù)端驗(yàn)證apple的登陸驗(yàn)證token,客戶(hù)端的集成可以參考apple開(kāi)發(fā)者或其他文章介紹:

https://developer.apple.com/sign-in-with-apple/get-started/

https://developer.okta.com/blog/2019/06/04/what-the-heck-is-sign-in-with-apple#create-a-private-key-for-client-authentication

在服務(wù)端部署之前,我們需要了解,客戶(hù)端APP蘋(píng)果授權(quán)登陸成功后會(huì)提供如下幾個(gè)參數(shù)到服務(wù)端:userID、email、fullName、authorizationCode、identityToken

userID :用戶(hù)的唯一標(biāo)識(shí),可以作為下次登陸驗(yàn)證的依據(jù)

email :授權(quán)的時(shí)候用戶(hù)可以選擇隱藏郵件,所以這里的郵件信息可能不準(zhǔn)確

fullName:用戶(hù)的昵稱(chēng)

authorizationCode:暫時(shí)還不知道怎么用

identityToken:JWT格式,關(guān)鍵信息,用于驗(yàn)證登陸使用

1、安裝JWT,此庫(kù)的作用是將identityToken的信息解碼出來(lái),以及驗(yàn)證JWT是否有效

npm install jsonwebtoken

關(guān)于JWT格式的介紹:

http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html

2、安裝JWK,此庫(kù)的作用是將從apple獲取的公鑰信息生成pem,用于驗(yàn)證上面的identityToken

npm install jwk-to-pem

3、詳細(xì)的代碼流程如下

let jwt         = require("jsonwebtoken");
let jwkToPem    = require('jwk-to-pem');
let Promise     = require('bluebird');
let get         = Promise.promisify(require('request').get, {'multiArgs': true});

function appleLogin(req,res){

let userID          = req.body.userID;
let nickName        = req.body.nickName;
let identityToken   = req.body.identityToken;

//解碼JWT信息
// let data = jwt.decode(identityToken,{
//     'complete':true
// });
// console.log(data);

// 從apple獲取公鑰信息
return get({
    'url':'https://appleid.apple.com/auth/keys',
}).then(function(args){

    var body = args[1];

    if (body.error) {
        console.log("apple login fail = "+ JSON.stringify(body));
        return false;
    }
    let keys =  JSON.parse(body);
    console.log(JSON.stringify(keys));

    //將獲取的公鑰信息轉(zhuǎn)成Pem
    let publicKey = jwkToPem(keys.keys[0]);
    let isLogin = false;
    let payload;

    //將從apple獲取的公鑰驗(yàn)證客戶(hù)端發(fā)過(guò)來(lái)的JWT信息, payload為JWT的中間信息
    jwt.verify(identityToken,publicKey,(error,decoded)=>{
        if (error) {
            console.log(error.message)
            return;
        }
        payload = decoded;
        isLogin = true;
    });

    if (isLogin){
        return true;   
    }
    return false;
})
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容