【问题标题】:why doesn't $http work when Authorization header set?为什么设置授权标头时 $http 不起作用?
【发布时间】:2016-05-30 01:08:57
【问题描述】:

Angular 新手 - 无法弄清楚这一点。设置授权标头时,$http 调用不会到达服务器。我的功能:

loginHttp: function(name, pw) {

        var req = {
         method: 'GET',
         url: 'http://mywebsite/login',
         headers: {
           'Authorization': "Basic "+ this.b64EncodeUnicode("user1:pass1")
         },
         data: { test: 'test' }
        }

        //$http.defaults.headers.common['Authorization'] = "Basic "+ this.b64EncodeUnicode("user1:pass1");

        //$http.defaults.headers.common['Accept'] = "text/html";

        $http(req).then(function(resp) {
          console.log('Success', resp);
          // For JSON responses, resp.data contains the result
        }, function(err) {
          console.error('ERR', err);
          // err.status will contain the status code
        } )
      },

回复是:

ERR Object { data: null, status: 0, headers: headersGetter/

无需标题或设置其他标题即可正常工作,例如接受:...

任何帮助将不胜感激。

我完整的 LoginService 服务在这里:

.service('LoginService', function($q, $http) {
    return {
      loginHttp: function(name, pw) {
        alert(this.b64EncodeUnicode("teacherb:loops411"))

        var req = {
         method: 'GET',
         url: 'http://mywebsite/login',
         headers: {
           'Authorization': "Basic "+ this.b64EncodeUnicode("teacherb:loops411")
         },
         data: { test: 'test' }
        }

        //$http.defaults.headers.common['Authorization'] = "Basic "+ this.b64EncodeUnicode("teacherb:loops411");
        //$http.defaults.headers.common['Accept'] = "text/html";
        $http(req).then(function(resp) {
          console.log('Success', resp);
          // For JSON responses, resp.data contains the result
        }, function(err) {
          console.error('ERR', err);
          // err.status will contain the status code
        } )
      },

      b64EncodeUnicode: function (str) {
          return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
              return String.fromCharCode('0x' + p1);
          }));
      },

      loginUser: function(name, pw) {
        var deferred = $q.defer();
        var promise = deferred.promise;

        if (name == 'user' && pw == 'secret') {
          deferred.resolve('Welcome ' + name + '!');
        } else {
          deferred.reject('Wrong credentials.');
        }
        promise.success = function(fn) {
          promise.then(fn);
          return promise;
        }
        promise.error = function(fn) {
          promise.then(null, fn);
          return promise;
        }

        return promise;
      }
    }
  })

【问题讨论】:

  • 看起来是 HTTP 访问控制 (CORS) 问题 - 访问跨源 URL 时无法使用 auth 标头。只希望错误消息没有对问题如此难以描述 - 会节省很多时间。

标签: angularjs angularjs-service


【解决方案1】:

看起来这是一个 HTTP 访问控制 (CORS) 问题 - 访问跨源 URL 时无法使用 auth 标头。

【讨论】:

  • 您可以将 auth 标头与 CORS 一起使用,您只需要确保服务器在允许的标头中发送 Authorization 标头
猜你喜欢
  • 2018-07-24
  • 2017-12-20
  • 2023-04-10
  • 2015-03-03
  • 2013-09-24
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多