如何向客户端发送Facebook登录后创建的JSON Web令牌?

时间:2016-09-17 22:00:18

标签: node.js passport.js jwt passport-facebook

我正在尝试找到一种方法将在服务器端创建的JSON Web令牌发送到客户端,以便客户端可以将其存储在HTML5本地存储中。

具体来说,我使用Passport进行身份验证的NodeJS / ExpressJS构建的应用程序有两种用户:本地用户和facebook用户。

当本地用户使用其用户名和密码填写登录表单时,客户端会要求服务器进行身份验证,服务器会向客户端发送JWT,然后将其存储在本地存储中。

         $.ajax({
             url: "/authenticate",
             type: 'POST',
             data: user,
             dataType: "json",
             success: function(auth){
                 localStorage.setItem("token", auth.token);
                 window.location.href = '/welcome.html';
             },
             failure: function(errMsg) {
                 alert("falure");
                 window.location.href = '/login.html';
             }
         });

然后,用户被重定向到欢迎页面,该页面在本地存储中查找以查找令牌,以便从数据库中请求一些数据。

$.ajax({
    url: "/protectedEndpoint",
    type: 'GET',
    dataType: 'json',
    beforeSend: function (xhr){
        xhr.setRequestHeader('Authorization', localStorage.token);
    },
    success: function (data) {
        ...
    },
    error: function (e) {
        alert(e.status + " " + e.statusText + " - " + e.responseText);
    }

然而,当facebook用户登录时,一切都在服务器端发生,所以我不知道如何将JWT存储在本地存储中。

以下是facebook-passport身份验证的服务器端代码:

app.get('/auth/facebook', passport.authenticate('facebook', {scope: ['email']}));

app.get('/auth/facebook/callback',
    passport.authenticate('facebook', {session: false, failureRedirect: '/login.html' }),
    function (req, res) {
        res.redirect('/welcome.html');
    });

提前多多感谢!

1 个答案:

答案 0 :(得分:2)

将OAuth与JWT结合起来并不是您已经发现的主要用例。其中一种可能的方法是使用OAuth回调中的重定向网址转移令牌。

passport.authenticate('facebook', {session: false, failureRedirect: '/login.html' }),
function (req, res) {
    // Create JWT token here are pass it back to front application
    res.redirect(`/token/${JWT}`);
});

在前端应用程序设置中,可以处理令牌的路由将其保存到本地/会话存储。