2016-09-17 69 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的值。 –

相關問題