Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何向客户端发送facebook登录后创建的JSON Web令牌?_Node.js_Passport.js_Jwt_Passport Facebook - Fatal编程技术网

Node.js 如何向客户端发送facebook登录后创建的JSON Web令牌?

Node.js 如何向客户端发送facebook登录后创建的JSON Web令牌?,node.js,passport.js,jwt,passport-facebook,Node.js,Passport.js,Jwt,Passport Facebook,我试图找到一种方法,将服务器端创建的JSON Web令牌发送到客户端,以便客户端可以将其存储在HTML5本地存储中 具体来说,我的应用程序是用NodeJS/ExpressJS构建的,使用Passport进行身份验证,它有两种用户:本地用户和facebook用户 当本地用户用用户名和密码填写登录表单时,客户端请求服务器进行身份验证,服务器向客户端发送JWT,然后将其存储在本地存储器中 $.ajax({ url: "/authenticate",

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

具体来说,我的应用程序是用NodeJS/ExpressJS构建的,使用Passport进行身份验证,它有两种用户:本地用户和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');
    });

提前多谢

您已经发现,将OAuth与JWT结合并不是主要的用例。其中一种可能的方法是在OAuth回调中使用重定向URL传输令牌

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}`);
});

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

您可以做的另一件事是重定向到您想要的任何页面(可能是他们在登录之前尝试去的任何地方)。只需将
#token=${JWT}
附加到路由,然后客户端代码就可以简单地查找
窗口。哈希
,解析它,将它存储在localStorage中,然后将
window.hash
设置为空字符串。如果我只有facebook登录,那么创建JWT是没有用的?取决于您是否有单页应用程序,并且数据交互是通过REST API完成的,并且您不想要或使用cookies,那么JWT仍然是一个可能的解决方案。使用JWT既有优点也有缺点。如果它是服务器端呈现的应用程序,并且您使用了anyway cookies来存储会话id,那么我看不到在这里使用JWT的值。