本篇主要內(nèi)容是將如何在服務(wù)端驗(yàn)證apple的登陸驗(yàn)證token,客戶(hù)端的集成可以參考apple開(kāi)發(fā)者或其他文章介紹:
https://developer.apple.com/sign-in-with-apple/get-started/
在服務(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;
})
}