使用谷歌oauth2时的状态代码405

时间:2017-09-16 12:10:41

标签: angularjs django google-oauth2 http-status-code-405

我正在使用Django和Angular JS来访问Google Drive API。我正在关注Google的this文档。 FLOW.step1_get_authorize_url()为我提供了类似于页面上提到的示例网址的网址。但问题是,在return HttpResponseRedirect(authorize_url)之后,浏览器不会重定向到authorize_url并提供错误,如下图所示(Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:8000' is therefore not allowed access. The response had HTTP status code 405)。

enter image description here

但如果我复制粘贴网址,它就可以正常工作。

oauth2函数看起来像这样。

def index(request):

    FLOW = flow_from_clientsecrets(
        settings.GOOGLE_OAUTH2_CLIENT_SECRETS_JSON,
        scope='https://www.googleapis.com/auth/drive',
        redirect_uri='http://127.0.0.1:8000/oauth2callback/'
    )
    FLOW.params['access_type'] = 'offline'
    authorize_url = FLOW.step1_get_authorize_url()
    return HttpResponseRedirect(authorize_url)

这是oauth2callback函数。

def auth_return(request):
    credential = FLOW.step2_exchange(request.GET)
    return HttpResponseRedirect("/mycustomurl")

我使用this在Django服务器端启用CORS。这是我在Angular中的服务部分,它调用了oauth2。

(function () {

    'use strict';

    angular.module('myApp')
    .service('myService', function ($http) {

        this.saveToDrive = function (startYear, endYear, shape) {
            var config = {
                    params: {
                        start: '1999',
                        end: '2002',
                        action: 'download-to-drive'
                    },
                    headers: {
                        'Access-Control-Allow-Origin': '*',
                        'X-Requested-With': null
                    }
            }

            var promise = $http.get('/oauth2/', config)
            .then(function (response) {
                return response.data;
            });
            return promise;
        };

    });

})();

请建议我在这里缺少什么。任何帮助或建议都非常感谢。

1 个答案:

答案 0 :(得分:0)

我发现这是一个次要的设计问题,而不是代码问题。我将发送oauth2请求的逻辑分离到客户端,在oauth2请求之后,我使用params选项向内部API发送了请求。现在它工作正常。