Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Access Denied with $http request in Angular and IE8

I am trying to get my angular app to do an $http.get request. Works everywhere but IE8. I am using latest Angular (1.0.6 I think). The only message IE gives is:TypeError:

Access is denied. undefined (in previous angular this was )

My host (nodejs)is set to send cors headers:

res.header('Access-Control-Allow-Origin', '*'); //config.allowedDomains
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, X-Requested-By');
res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');

I have tried to get more info about the error using debug tools but:

Fiddler: doesn't show xmlhttprequests - seems you can hack your NET app to fix that but not sure what to do with my web page. DebugBar: doesn't show these requests either FirebugLite: 2 version I tried are broken - just random errors and doesn't load

Changing the hosts to same origin clears the issue so I assume it's trying something but man it's hard to debug.

Angular posts on this seem outdated and I am not sure what to do from here.

like image 949
cyberwombat Avatar asked Apr 11 '13 23:04

cyberwombat


3 Answers

This has nothing to do with $http. $http lets you make XHR(XDR) or JSONP requests. It doesn't provide a mechanism to circumvent the browsers same origin policy.

Changing the hosts to same origin clears the issue so I assume it's trying something but man it's hard to debug.

That's the key to your problem. IE8 doesn't support Cross-Origin-Resource-Sharing (CORS) very well. In order to make cross domain calls with IE8, you better off either:

  1. Use your nodejs app to proxy the request for you, letting you use the same domain.
  2. Use JSONP in your $http.get() request

There are a number of gotchas associated with CORS and IE8, which are outlined here.

like image 187
Alan Avatar answered Oct 20 '22 03:10

Alan


I was running into this same issue, and while it's likely not ideal, one solution is to change IE's 'Access data sources across domains' security setting to Enable or Prompt:

http://technet.microsoft.com/en-us/library/dd346862.aspx

In my case I was running into the same thing when trying to fetch data (via angular's $resource) from my own API that was hosted on another domain. In IE8 & IE9 these requests would fail with the error you described above. Changing the security setting in IE to allow cross-domain data requests resolved that problem.

like image 21
Sam Storie Avatar answered Oct 20 '22 03:10

Sam Storie


AngularJS doesn't support IE<=9 CORS.

As required, there is a link to github official AngualrJS website :

AngularJS Github official discussion

like image 26
Ant Avatar answered Oct 20 '22 03:10

Ant