我应该从外部站点获取受保护的页面,如果直接调用它,则会收到错误消息:
错误请求
邮递员:
但是,如果我通过邮递员使用有效凭据调用登录页面:
,然后从我得到受保护页面的同一位邮递员那里调用相同的资源页面!
我必须在网站上获得同一页面。我尝试通过以下方式实现它:
var loginXml = "<Request><MsgType>Authenticate</MsgType><SubMsgType>Login</SubMsgType><UserID>my_login</UserID><passwordNotEncrypted>my_password</passwordNotEncrypted></Request>";
$.ajax(
{
url: 'https://address/browserservices.aspx/login',
type: 'POST',
contentType: 'text/xml',
datatype: 'text',
//xhrFields: {
// withCredentials: true
//},
//crossDomain: true,
data: loginXml,
success: function (output, status, xhr) {
alert(xhr.getResponseHeader("Set-Cookie"));
$.ajax({
url: "https://address/RemoteSupport.aspx?id=GUID&pltFrmType=Android&agentversion=13.46",
type: 'GET',
xhrFields: { withCredentials: true },
//crossDomain: true,
success: function (x) { },
error: function (xhr, textStatus) { alert(xhr.status); }
});
},
})
但是我再次得到Bad Request
。
我应该传递到页面的哪些标题/ cookie以打开受保护的页面,就像在邮递员中一样?
添加了28/01/19 成功登录请求后的邮递员“ Cookie”选项卡(失败登录请求具有相同的内容):
和“标题”标签:
如我所见,所有access-control-allow标头都可用。我应该通过ajax通过什么?
答案 0 :(得分:1)
根据您提供的信息,有两种可能的情况。
首先,由外部站点设置的cookie是HttpOnly。单击 Cookies 标签,这很容易签入Postman。
第二个选项稍微复杂一点,但是外部服务器必须正确设置访问控制标头。再次有一个 Headers 标签来查看这些内容。有关此问题中跨域Ajax和标头的更多信息:Why is jquery's .ajax() method not sending my session cookie?
最后值得注意的是,您的浏览器将自动添加一个标头,以表明这是一个ajax请求。您可以尝试在Postman中添加X-Requested-With: XMLHttpRequest
标头,并查看它与示例的不同之处。可以将外部服务器配置为对Ajax请求的响应与对浏览器或服务器服务器api请求的响应不同。
更新 您的邮递员更新显示这两种情况都是正确的。不幸的是,这意味着您无法使用JavaScript达到所需的结果。 HttpOnly = true表示浏览器将永远不允许您页面上的脚本访问cookie。
这时,最好的选择可能是在自己的站点上编写一个小的代理方法,该方法将请求服务器连接到服务器,然后将结果返回到JavaScript代码。尽管您需要对数据发出2个请求而不是1个请求,但这应该绕过上述所有问题。
看看此答案的一些代码
Struggling trying to get cookie out of response with HttpClient in .net 4.5