2016-09-17 72 views
3

我试图找到一种方法将在服务器端创建的JSON Web令牌发送到客户端,以便客户端可以将其存储在HTML5本地存储中。如何向客户端发送Facebook登录后创建的JSON Web Token?

具体来说,我的应用程序,这是建立与的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护照认证:

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

结合智威汤逊的OAuth的你已经发现了不是主要的使用情况。其中一种可能的方式是在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}`); 
}); 

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

+0

你可以做其他的事情只是重定向到你想要的任何页面(也许只要他们试图为需要登录后才去)。只需将'#token = $ {JWT}'追加到路由中,您的客户端代码就可以简单地查找'window.hash',解析出它,将其存储在localStorage中,然后将'window.hash'设置为空字符串。 – idbehold

+0

如果我只有Facebook登录,那么创建智威汤逊是没用的? –

+0

取决于您是否有单页应用程序,并且数据交互是通过REST API完成的,并且您不想要或不使用Cookie,那么JWT仍然是一种可能的解决方案。使用JWT有利弊。如果它是服务器端呈现的应用程序,并且您仍然使用cookie来存储会话ID,那么我在这里看不到使用JWT的值。 –

相关问题