Sign in with Apple 服务端验证(nodejs 版)

本篇主要内容是将如何在服务端验证apple的登陆验证token,客户端的集成可以参考apple开发者或其他文章介绍:

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

在服务端部署之前,我们需要了解,客户端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;
})
}

你可能感兴趣的:(Sign in with Apple 服务端验证(nodejs 版))