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