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的值。 –