2013-10-24 33 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