使用jQuery进行基本身份验证:访问受限制的URI拒绝代码:“1012”(NS_ERROR_DOM_BAD_URI)

时间:2013-09-22 03:42:50

标签: javascript jquery ajax basic-authentication

我正在尝试使用JavaScript(jQuery)登录我的Netgear路由器:

username = "admin";
password = "myrouterpassword";
url = "http://192.168.1.1";
async = false;
type = "GET";
timeout = 3000;
$.ajax({url:url, type:type, async:async,
        username:username, password:password, 
        success: function(reponse) {.. stuff ..}, 
        error: function(error) {.. stuff ..}
      });

这会在Firefox中返回“访问受限URI拒绝”错误,并在Chrome中返回“NetworkError:发生网络错误”。我不相信这是一个跨域问题,因为我正在使用一个非常相似的jQuery构造调用192.168.1.2的另一个资源,它的工作就像一个魅力(除了没有密码保护,所以我不是使用用户名和密码字段。)

我的jQuery版本是1.9.1。我在这里尝试了几种变体。例如,将其添加到ajax选项:

xhrFields:{ withCredentials: true }

我还尝试不使用用户名和密码字段并使用标头而不是使用Base 64计算auth并使用它:

headers:{'Authorization':auth}

我也尝试了较旧的推荐方法:

beforeSend:function(req) { req.setRequestHeader('Authorization', auth); }

当我在后端使用Python访问此路由器时,它完全有效:

passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, baseurl, username, password)
authhandler = urllib2.HTTPBasicAuthHandler(passman)
opener = urllib2.build_opener(authhandler)
urllib2.install_opener(opener)
devhandle= urllib2.urlopen(baseurl+'/DEV_device.htm')
devcontent=devhandle.read()

这为我提供了连接到此路由器的设备列表。我真的需要在Javascript中做到这一点,并且知道我能够连接到完全相同域(192.168.1.x)中的其他设备,这表明它应该是可行的。对所有建议开放,非常感谢任何帮助!

附加信息:我添加了 dataType:“html”,错误更改为* NS_ERROR_DOM_BAD_URI *。添加 dataType:“json”会导致相同的事情。当我将其更改为 dataType:“jsonp”并且还有 xhrFields:{withCredentials:true} 时,我突然看到路由器的登录框突然弹出!所以,它显然已经到达了路由器。我显然不希望这样 - 登录应该默默发生,但它仍然是一些东西。我登录时会在错误消息中回复: {“readyState”:4,“status”:200,“statusText”:“success”} 。登录弹出窗口是暂时的(当然,因为一旦我登录,它就不会再次提示我)。还在摆弄它。如果我让它工作,我会更新。如果有一些想法,请告诉我。

CHROME CONSOLE INFO :这是我在控制台中看到的:

Resource interpreted as Script but transferred with MIME type text/html: "http://192.168.1.1/?callback=jQuery19109538986752741039_1379841839394&_=1379841839396". jquery-1.9.1.js:8336
send jquery-1.9.1.js:8336
jQuery.extend.ajax jquery-1.9.1.js:7978
ajaxnow mainscreen.htm:79
onclick mainscreen.htm:1
Uncaught SyntaxError: Unexpected token < 

ajaxnow()是我脚本中的一个函数,用于调用.ajax。

3 个答案:

答案 0 :(得分:1)

如果您遇到跨域问题,并且想要禁用该检查,则可以在没有网络安全的情况下运行Chrome:

chromium-browser --disable-web-security

不言而喻,如果您的浏览器为任何敏感网站提供Cookie /保存密码,这将非常危险。

答案 1 :(得分:0)

首先,将“http://”添加到您的网址。

然后,python不会强制执行同源策略,但浏览器会这样做。浏览器将根据来自目标主机的OPTIONS响应的Access-Control-Allow- *标头允许/拒绝跨源请求。 MDN reference。因此,除非您可以修改路由器的页面/响应或运行安全翻录版本的浏览器,否则它将不会发生在不同主机上的浏览器中。

最后,也许你应该使用node.js。

答案 2 :(得分:-1)

当您尝试重置网络路由器路由器时,我可能无意中发现了此192.168.1.1:80错误消息的修复程序。工作人员对我的简短回答(在尝试发布所有建议之后)是重新连接并重启所有内容。

最终,在无法保护网络2天但通过互联网连接后,只要我的Mac笔记本电脑连接到它并且互联网完全关闭,我的前景就会冻结。我在度假时住在租来的公寓,所以没有为Netgear WNR1000v3路由器安装CD。 在完全失去连接之后,我重新启动路由器并重新连接所有连接(没有好处),最后重新启动有线调制解调器((科学亚特兰大)并重新上网,同时输入相同的192.168.1.1:80消息192.168 .1.1进入浏览器,它最后让我输入默认的用户名和密码(用户,密码),登录路由器(通过192.168.1.1)并允许访问所有设置,包括更改密码设置。