2016-03-07 63 views
0

我需要知道,如果我的身份驗證和會話管理方法是正確的。會話和登錄Node和AngularJS的用戶數據

我使用會話管理,因爲當我收到成功的身份驗證。來自節點服務器。我在$ window.sessionStorage中存儲了用戶數據(沒有任何傳遞的痕跡),並且如果用戶標記爲rememberMe(複選框),則也將數據存儲在$ window.localStorage中。

通過這個我能夠在不同的控制器中獲取數據。儘管我在服務器(nodeJs)的某個地方閱讀會話實現方面也是可能的。但我不確定如何與JSONToken身份驗證一起使用會話。

我正在使用 https://jasonwatmore.com/post/2015/12/09/MEAN-Stack-User-Registration-and-Login-Example.aspx 作爲一個學習的例子,但我無法理解它。

/app/app.js

爲什麼在run()方法?

// add JWT token as default auth header 
    $http.defaults.headers.common['Authorization'] = 'Bearer ' + $window.jwtToken; 

,什麼是這樣的:因此,使用會話服務器端與智威湯遜那種失敗的使用目的

// manually bootstrap angular after the JWT token is retrieved from the server 
$(function() { 
    // get JWT token from server 
    $.get('/app/token', function (token) { 
     window.jwtToken = token; 

     angular.bootstrap(document, ['app']); 
    }); 
}); 

/controllers/app.controller.js

// use session auth to secure the angular app files 
router.use('/', function (req, res, next) { 
    if (req.path !== '/login' && !req.session.token) { 
     return res.redirect('/login?returnUrl=' + encodeURIComponent('/app' + req.path)); 
    } 

    next(); 
}); 

// make JWT token available to angular app 
router.get('/token', function (req, res) { 
    res.send(req.session.token); 
}); 

// serve angular app files from the '/app' route 
router.use('/', express.static('app')); 

回答

0

智威湯遜。 JWT在很多方面都很棒,但它們的優點之一就是無論哪個服務器攔截請求,他們都可以驗證用戶。

如果你把它放在一個會話中,你必須確保客戶端保持去同一臺服務器,因爲會話保存在該機器的內存中。有很多方法可以解決這個問題,但它又有點挫敗了JSON Web令牌的目的。

我做什麼我有角/節點認證/ JWT剛剛通過了JWT早在頭每一次,和我的中間件截獲它:

req.header.whatever_my_tokens_name_is 
+0

如何在sessionStorage和localStorage中存儲數據? –

+0

你可以向我解釋我突出顯示的代碼部分 –

+0

那些在客戶端上是好的。所以您只需從客戶端抓取它們,並在每次使用時將它們傳回服務器。然而,我會阻止在服務器端使用會話。瞭解使用localStorage可能會導致XSS攻擊,因此請確保在應用程序中使用適當的頭文件。雖然Angular有很多內置的防禦措施!我爲我的應用程序使用localStorage。你應該做的其他事情,沒有localStorage和sessionStorage的區別,只是根據需要過期/更新JWT。 –

0

下面的代碼設置$ HTTP將每個請求的JWT令牌發送到服務器。

// add JWT token as default auth header 
$http.defaults.headers.common['Authorization'] = 'Bearer ' + $window.jwtToken; 

下面的代碼從'/ app/token'獲取令牌並將其存儲在LocalStorage中。之後,它開始角度。

// manually bootstrap angular after the JWT token is retrieved from the server 
$(function() { 
    // get JWT token from server 
    $.get('/app/token', function (token) { 
     window.jwtToken = token; 

     angular.bootstrap(document, ['app']); 
    }); 
}); 

這裏這是檢查中間件如果沒有存儲在req.session.token令牌和請求的URL不是「/登錄」。如果是這樣,請將重定向發送到「/ login」。

// use session auth to secure the angular app files 
router.use('/', function (req, res, next) { 
    if (req.path !== '/login' && !req.session.token) { 
     return res.redirect('/login?returnUrl=' + encodeURIComponent('/app' + req.path)); 
    } 

    next(); 
}); 

最後在這裏,這是一個端點,客戶端再次從服務器請求'/ token'。

// make JWT token available to angular app 
router.get('/token', function (req, res) { 
    res.send(req.session.token); 
}); 

無論如何,檢查@摩根-克響應regarless會話側和JWT。

我希望這會有所幫助。