我正在尝试找到一种方法将在服务器端创建的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');
});
提前多多感谢!
答案 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}`);
});
在前端应用程序设置中,可以处理令牌的路由将其保存到本地/会话存储。