2014-07-08 32 views
2

我目前正在製作一個Web應用程序,當用戶登錄時,我不希望將頁面重定向 - 相反,我希望客戶端只更新當前頁面上(我想過使用AJAX請求)。我正在使用帶護照的nodejs後端作爲我的身份驗證中間件。無重定向安全性的護照登錄(Node.js)

客戶方:

目前,我有,我要檢查登錄狀態簡單地調用一個函數的onload頁:

function fetchLoginStatus(){ 
    var request = new XMLHttpRequest(); 
    request.open("GET", "/checkLogin.json", false); 
    request.send(); 
} 

服務器端:

在服務器中,我有以下路線:

app.get('/checkLogin.json', passport.authenticate('local-login'), function(req, res){ 
    res.send(req.user.username); 
}); 

回到客戶端上的,我檢查這個響應數據,看是否有用戶成功登錄。

這安全嗎?使用JSON進行身份驗證?還有更好的方法來完成這個嗎?

+1

使用API​​(JSON)進行身份驗證非常正常,但通常這是通過「POST」請求而不是「GET」完成的。其中包含登錄憑據(這意味着它確實應該是HTTPS)。這是你的意思嗎? – dylants

回答

0

我在代碼中看不到您實際上將憑證信息發送到您的服務器。假設「/checkLogin.json」不是JSON對象,而是http端點的名稱,則必須使用POST請求的主體發送憑據信息(通常爲用戶和密碼),正如dylants所述。例如:

//client side, angular.js: post with user, password 
$http({ 
      method: 'POST', 
      url: '/api/login', 
      data: {usr: usr, psw:psw} 
     }). 
      success(function(data, status, headers, config) { 
       $rootScope.authcode = self.ROLE_AUTH; 
       $http.defaults.headers.common.Authorization = data.tkn; 
       cb(null); 
      }). 
      error(function(data, status, headers, config) { 
       console.log("error loggin in", data, status); 
       cb("AUTHENTICATION_ERROR"); 
      }); 

然後,在服務器端,使用該憑證信息與一些後端服務(通常爲BD)驗證並返回認證令牌:

exports.login = function(request, reply){ 

    var usr = request.payload.usr; 
    var psw = request.payload.psw; 

    var token = MuAuth.login(usr, psw, function(token){ 
     if(token != null){ 
      reply({tkn:token}); 
     }else{ 
      var error = Hapi.error.badRequest('auth error'); 
      //return 401 if authorization fails 
      error.output.statusCode = 401; 
      error.reformat(); 
      reply(error); 
     } 
    }); 
}; 

注意的是,在客戶端方面,如果認證調用成功,authtoken將被添加到http默認標題中。通過這種方式,它將被包含在所有未來對服務器的調用中。