我正在构建一个名为Git Crx的Chrome打包应用程序,顾名思义,它需要使用HTTPS(智能协议)向远程git repos发送网络请求但是如果您尝试对网址执行XHR请求返回401,XHR将在不使用普通浏览器凭证机制的情况下失败,而先前打包的应用程序将显示浏览器正常凭证请求UI。
现在我认为这对我来说确实有意义,因为Chrome应用程序应该是独立的应用程序,而不仅仅是网页,它们恰好使用Chrome作为运行时。
但问题是,Chrome Apps现在如何处理使用普通http身份验证(返回401状态代码)的网站的身份验证,而不是使用Chrome应用程序可用的身份验证API支持的OAuth?
答案 0 :(得分:2)
所以在研究这个问题时,我自己找到了答案......
首先基于从XHR响应中获取401作为状态,我可以设置Authorization标头进行身份验证,以QUnit测试用例的形式提供代码:
asyncTest("check can do Basic Auth XHR", function() {
expect(1);
var authCreds = "maks:s3cret";
var oReq = new XMLHttpRequest();
function reqListener () {
if (this.status == 200) {
equal(this.responseText.trim(), "the secret", "expect correct res text from server");
start();
} else if (this.status == 401) {
oReq = new XMLHttpRequest();
oReq.onload = reqListener;
oReq.open("get", "http://acme.test.com/auth-test", true);
oReq.setRequestHeader("Authorization", "Basic "+btoa(authCreds));
oReq.send();
}
}
oReq.onload = reqListener;
oReq.open("get", "http://acme.test.com/auth-test", true);
oReq.send();
});
但是假设该方案是Basic,但它可能是Digest或NTLM,所以你还需要解析响应头...
var authType = oReq.getResponseHeader('WWW-Authenticate');
// do auth based on type...
希望这将有助于其他人在同一条船上...