angularjs:$ http基本身份验证

时间:2015-04-08 18:48:32

标签: angularjs http-authentication http-basic-authentication angularjs-http

我尝试了angular.js并开始使用web-ui进行安静的api(使用http basic auth)。它非常好,除授权外都有效。

到目前为止,我使用$http.defaults.headers.common.Authorization来设置密码,但主要是浏览器打开他的http-basic-auth的默认登录表单。另一个奇怪的行为是angular-request不包含Authorization-Header(既不是OPTIONS也不是GET请求)。我还尝试使用header-config在每个请求上设置此标头,但这也没有用。

我必须设置一些特殊的标题吗?或者我是否必须在特殊环境中设置$http.defaults.headers.common.Authorization

tools.factory('someFactory', function ($http, Base64) {

  //...

  factory.checkAuth = function (username, password) {
    storeCredentials(username, password);
    factory.initConnection();
    return factory.getData();
  };

  factory.initConnection = function(){
    var credentials = loadCredentials();

    factory.authHeader = 'Basic ' + Base64.encode(credentials.username + ':' + credentials.password);

    $http.defaults.headers.common.Authorization = factory.authHeader;
  };

factory.getData = function () {
    return $http({
      method: 'GET',
      url: urlBase + '/happening',
      headers: {
      //  'Authorization': factory.authHeader
      }
    });
  };

请求标头:

  

OPTIONS / v8 /发生HTTP / 1.1
  主持人:api.gospry.com
  连接:保持活力   访问控制请求方法:GET
  来源:http://web.gospry.com
  用户代理: [..]   访问控制请求标题:接受,授权
  接受:* / *
  推荐人:http://web.gospry.com/
  Accept-Encoding:gzip,deflate,sdch
  Accept-Language:en-US,en; q = 0.8

响应头:

稍微修改了后端以支持CORS(Access-Control-headers和preflight-request-support)。

  

HTTP / 1.1 401未经授权
  服务器:Apache-Coyote / 1.1
  Access-Control-Allow-Origin:http://web.gospry.com
  访问控制允许方法:POST,GET,PUT,PUSH,OPTIONS,DELETE
  Access-Control-Max-Age:3600
  Access-Control-Allow-Headers:Origin,X-Requested-With,Content-Type,Authorization
  X-Content-Type-Options:nosniff
  X-XSS-Protection:1;模式=块
  Cache-Control:no-cache,no-store,max-age = 0,must-revalidate
  Pragma:no-cache
  到期:0
  严格运输安全:max-age = 31536000; includeSubDomains
  X-Frame-Options:DENY
  Set-Cookie:JSESSIONID = 2DDC92A1B0DC57C221CDC3B7A5DC1314;路径= / V8 /;安全;仅Http
  WWW-Authenticate:Basic realm =" Realm"
  X-Content-Type-Options:nosniff
  Cache-Control:no-cache,no-store,max-age = 0,must-revalidate
  Pragma:no-cache
  到期:0
  X-Frame-Options:DENY
  允许:GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,PATCH
  内容长度:0
  日期:2015年4月8日星期三18:04:04 GMT

2 个答案:

答案 0 :(得分:1)

我使用拦截器。我无法在您的代码中发现问题,但这是我正在使用的内容:

authModule.factory('CeradAuthInterceptor', 
['CeradAuthManager', function ( authManager) 
{
  return {
    request: function (config) 
    {
      config.headers = config.headers || {};
      if (authManager.authToken) 
      {
        config.headers.Authorization = 'Bearer ' + authManager.authToken;
      }
      return config;
    }
  };
}]);

appModule.config(['$httpProvider', function ($httpProvider) {
  $httpProvider.interceptors.push('CeradAuthInterceptor');
}]);

答案 1 :(得分:0)

您在登录表单中描述的问题在AngularJS Tips and Tricks Using ngResource中有解决方法。请参阅基本身份验证部分:

  

如果合适,解决方法是告知您的Web服务器在身份验证失败时返回401以外的内容,然后从那里开始。在AngularJS中,500(例如)将导致$ http承诺被拒绝,您可以根据需要处理它。如果您确实需要登录提示,则不建议这样做!