在过去的6个小时里,我一直在网上尝试了很多东西,我似乎无法解决这个问题。
我在http://localhost:3000
就我而言,我无法向OAuth2服务器请求令牌。
客户端代码:
.config(function($stateProvider, $urlRouterProvider, $httpProvider) {
//Reset headers to avoid OPTIONS request (aka preflight)
$httpProvider.defaults.headers.common = {};
$httpProvider.defaults.headers.post = {};
$httpProvider.defaults.headers.put = {};
$httpProvider.defaults.headers.patch = {};
$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
console.log($httpProvider.defaults.useXDomain);
console.log($httpProvider.defaults.headers.common);
})
$scope.doLogin = function() {
console.log('DUMMY - doLogin');
return $http.post('https://localhost:3000/oauth/token', 'grant_type=password&username=bob&password=secret&scope=offline_access',{
headers: {
'Authorization': 'Basic YWJjMTIzOnNzaC1zZWNyZXQ',
'Access-Control-Allow-Origin': 'https://localhost:3000',
'Accept': 'application/x-www-form-urlencoded',
'Content-Type': 'application/x-www-form-urlencoded'
}
}
)
.success(function(data, status, headers, config) {
// this callback will be called asynchronously
// when the response is available
})
.error(function(dataX, status, headersX, config) {
console.log(dataX);
console.log(status);
console.log(headersX);
console.log(config);
// called asynchronously if an error occurs
// or server returns response with an error status.
});
//fetchService();
};
服务器端代码
//Session Configuration
app.use(function(req, res, next){
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Origin', req.headers.origin);
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.header('Access-Control-Allow-Headers', 'Access-Control-Allow-Origin, Accept, Authorization, Content-Type');
if ('OPTIONS' == req.method) {
res.send(200);
} else {
next();
}
},express.session({
secret: config.session.secret,
store: sessionStorage,
key: "authorization.sid",
cookie: {maxAge: config.session.maxAge }
}));
我尝试添加所有可以找到的CORS正常运行要求,但它无效。
这是我在浏览器中收到的回复:https://www.dropbox.com/s/zcujugh2m4i0xml/Screenshot%202014-03-26%2000.46.51.png
我甚至没有看到我在临时标题中设置的标题,我阅读了大量的文章和stackoverflow问题,我只是想不出来。
在某些时候我虽然是某种https问题,但我在本地使用https并且OAuth2演示工作正常,Chrome中的REST控制台也工作得非常好,只有AngularJS决定让我花费很多时间试图解决这个问题:)。
可能是什么问题?
答案 0 :(得分:0)
不确定这是否会有所帮助,但看起来您正在尝试使用密码授予类型。此授权类型需要知识或用户凭据以及OAuth2客户端凭据(您将所有这些凭据交换为访问令牌)。
该授权不适用于客户端,因为这意味着将OAuth使用者凭据泄露给所有人。在JavaScript中,您可以使用值" Basic YWJjMTIzOnNzaC1zZWNyZXQ"为您的请求添加一个Authorization标头。这只是你的客户端凭证base64编码(所以解码它的abc123 / ssh-secret)。
对于客户端(即JavaScript)应用程序,通常建议使用隐式授权流程(http://tools.ietf.org/html/rfc6749#section-1.3.2)。
有一些Angular库支持它:例如https://github.com/enginous/angular-oauth
(我没有尝试使用这些库,因此我无法保证这些库)