我有一个需要基本身份验证的移动网络应用。我设法在不同域的服务器上使用Ajax调用基本身份验证。但是,我的回复有问题。
通常,会话ID将通过Ajax响应通过set cookie标头在浏览器中设置。我注意到成功验证后没有发生这种情况。
我所做的是尝试通过在返回响应时读取标题来手动设置cookie。我是通过jQuerys jqxhr对象实现的。令我惊讶的是,即使服务器指示返回了sessionID,我也无法通过jqxhr在响应中看到任何设置的cookie头。
这是跨域请求的预期行为吗?一些响应标题会被删除?这是浏览器的安全功能吗?如果是这样,你会建议解决这个问题(例如,在身体中返回会话ID,我不想这样做因为我在后台使用Shiro安全过滤器来处理这个问题,我不这样做想要破解它吗?
请帮忙
答案 0 :(得分:0)
您不能使用ajax来请求跨域uri。您必须实现自己的服务器端代理,它将使用远程身份验证服务器处理请求/响应。它可以只复制/粘贴响应,但它必须与您的客户端在同一个域中。
对于cookie来说,它们具有可以读/写的域。
您将被授权仅请求此代理。它还可以处理cookie创建过程,然后将cookie id返回给客户端。
对于(一个非常简单的)示例,在www.auth.com上,您有这个网络服务:
url : www.auth.com/auth
@params : string uuid, string password
@returns : int shiroSessionId // yes it's more complicated, but KISS for the example
您应该在www.mydomain.com/myAuth上创建一个类,该类使用相同的参数来访问www.auth.com/auth服务并创建本地会话cookie
url : /myAuth
@params : string uuid, string password
@returns : int cookieId, -1 if login failed
最后在www.mydomain.com/login.html中,您将进行以下js调用(此处为jquery):
$.ajax(function() {
url : '/myAuth',
date : {uuid: inputUuid, password: inputPassword}, // provided by a form
success(cookieId) {
if(cookieId > 0) {
alert('logged with cookie '+getCookie(cookieId));
} else {
alert('login failed');
}
}
});
希望它有所帮助。
此致