我尝试了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
答案 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承诺被拒绝,您可以根据需要处理它。如果您确实需要登录提示,则不建议这样做!