本篇主要内容是将如何在服务端验证apple的登陆验证token,客户端的集成可以参考apple开发者或其他文章介绍:
https://developer.apple.com/sign-in-with-apple/get-started/
在服务端部署之前,我们需要了解,客户端APP苹果授权登陆成功后会提供如下几个参数到服务端:userID、email、fullName、authorizationCode、identityToken
userID :用户的唯一标识,可以作为下次登陆验证的依据
email :授权的时候用户可以选择隐藏邮件,所以这里的邮件信息可能不准确
fullName:用户的昵称
authorizationCode:暂时还不知道怎么用
identityToken:JWT格式,关键信息,用于验证登陆使用
1、安装JWT,此库的作用是将identityToken的信息解码出来,以及验证JWT是否有效
npm install jsonwebtoken
关于JWT格式的介绍:
http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html
2、安装JWK,此库的作用是将从apple获取的公钥信息生成pem,用于验证上面的identityToken
npm install jwk-to-pem
3、详细的代码流程如下
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));
//将获取的公钥信息转成Pem
let publicKey = jwkToPem(keys.keys[0]);
let isLogin = false;
let payload;
//将从apple获取的公钥验证客户端发过来的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;
})
}