NodeJS OAuth2与AngularJS的CORS问题

时间:2014-03-25 22:50:47

标签: javascript node.js angularjs oauth-2.0 cors

在过去的6个小时里,我一直在网上尝试了很多东西,我似乎无法解决这个问题。

  1. 我在http://tok.client

  2. 下有一个本地测试Angular应用
  3. 我在http://localhost:3000

  4. 下有FrankHassanabad的OAuth2orize Recipes(https://github.com/FrankHassanabad/Oauth2orizeRecipes

    就我而言,我无法向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决定让我花费很多时间试图解决这个问题:)。

    可能是什么问题?

1 个答案:

答案 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

(我没有尝试使用这些库,因此我无法保证这些库)