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');
});
非常感谢提前!
你可以做其他的事情只是重定向到你想要的任何页面(也许只要他们试图为需要登录后才去)。只需将'#token = $ {JWT}'追加到路由中,您的客户端代码就可以简单地查找'window.hash',解析出它,将其存储在localStorage中,然后将'window.hash'设置为空字符串。 – idbehold
如果我只有Facebook登录,那么创建智威汤逊是没用的? –
取决于您是否有单页应用程序,并且数据交互是通过REST API完成的,并且您不想要或不使用Cookie,那么JWT仍然是一种可能的解决方案。使用JWT有利弊。如果它是服务器端呈现的应用程序,并且您仍然使用cookie来存储会话ID,那么我在这里看不到使用JWT的值。 –