2013-10-24 66 views
0

我使用節點並嘗試重定向客戶端後,他授權自己。爲此我使用的使用在客戶端AJAX它的形式POST方法:節點授權和重定向使用AJAX後

$.ajax({ 
    type: "POST", 
    url: '/login', 
    dataType: "json", 
    async: false, 
    beforeSend: function(xhr) { 
     xhr.setRequestHeader("Authorization", "Basic " + btoa(credentials.username + ":" + credentials.password)); 
    }, 
    data: credentials, 
    success: function() { 
     window.alert("Success! (whatever that means)"); 
    } 
}); 

然後在服務器端我試圖重定向到實際的頁面與命令

app.get('/login', loginInternalApp); 
app.post('/login', function (req, res){ 
    var postContents = req.body; 
    req.session.username = postContents.username; 
    res.redirect('/my_secret_page'); 
}); 
app.get('/my_secret_page', checkAuth, function (req, res) { 
    console.log("sending the message!"); 
    res.send('if you are viewing this page it means you are logged in'); 
    res.end(); 
}); 

其中checkAuth從這裏被採取how to implement login auth in node.js(而不是user_id我使用的用戶名;這不是問題)。

也許我不知道的是如何正確對待這個Ajax調用。我打印了一些控制檯消息,服務器一直到res.send('如果您正在查看此頁面...'),則客戶端上沒有任何反應。然後當我按控制-C來終止服務器時,彈出警報窗口。同時,我可以看到成功傳遞的函數可以有參數(現在猜測:errorCode,errorString,otherData,也許更多)。

那麼我做錯了什麼?

回答

3

這裏的問題是,你對JavaScript支持的導航和直接上傳的服務器請求 - 響應導航的概念有點混淆。讓我們通過這個一分鐘,看看它是否更有意義。

您正在使用ajax提交您的登錄表單,這意味着您將停留在您所在的頁面上,並且只需使用JavaScript提交您的http請求,即可收集響應。你掛上POST,你的服務器登錄用戶,然後返回一個3XX表示重定向。您的JavaScript收集響應,您可以在「網絡」選項卡下打開您的檢查器,看看您的響應。但是這個頁面並沒有去任何地方,因爲你只是用JavaScript收集你的迴應。

在這種情況下,您需要選擇其中一種 - 使用JavaScript來處理您的路由(類似backbone這類工具在這些情況下非常有用,並帶有很好的路由選擇類),或者正常提交登錄表單,不通過ajax。如果您在用戶點擊按鈕時提交表單並且沒有用JS捕獲表單,則應該解決此問題 - 如果您從服務器返回重定向,則頁面將按預期方式重定向。或者,如果不是發送重定向響應,您可以發回指示成功或失敗的JSON,然後使用JavaScript顯示適當的視圖,這也可以解決問題。

看看你的服務器端代碼,我假設你在這裏使用ajax的原因是爲了設置授權頭。我不確定爲什麼你需要這些,因爲你隱藏了內部認證功能,但你可能會發現而不是使用ajax的問題​​,因爲你在正常的表單提交中默認沒有這些自定義設置標題。確實有方法可以收集相同的信息並以相同的方式移動它(您可以設置標題,委託給其他方法,甚至可以發送來自快遞的http請求),但是我需要更多關於您是如何專門處理登錄以提示如何簡化該作品:)

+0

如果我通過使按鈕成爲「提交」按鈕來正常提交登錄,那麼它實際上會對地址執行GET操作: GET/login?username = whatever&password = something 這顯然不是我想要的。我真正想要的是用POST(我應該使用PUT?)提交用戶憑證,在會話中設置用戶名,並在隨後的來自客戶端的調用中使用在會話中找到的用戶名,以便弄清楚誰是GET/PUTTING/POSTING /等。我使用ajax,因爲它很簡單。我收集數據,我想發佈POST。 – MightyMouse

+0

我改變了標題,因爲我在SO的某個地方發現了這種情況必須發生。老實說,我想要做一些簡單的事情。 – MightyMouse

+0

已投放,因爲它有幫助。 – MightyMouse