2017-09-16 10 views
0

GoogleドライブAPIにアクセスするためにAngular JSでDjangoを使用しています。 Googleのthis文書に従っています。 FLOW.step1_get_authorize_url()は、このページに記載されているサンプルURLに類似した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)のようにエラーを出します。ステータスコード405 google oauth2を使用しています

enter image description here

しかし、私はURLを貼り付けコピーした場合、それが正常に動作します。

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を有効にしました。ここにoauth2への呼び出しを行うAngularのサービスの私の部分です。

(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; 
     }; 

    }); 

})(); 

私はここで何が欠けているかお勧めします。どんな助けや提案も高く評価されます。

+0

'CORS_ORIGIN_ALLOW_ALL = True'または' CORS_ORIGIN_WHITELIST =( '127.0.0.1:8000'、) 'を' settings'に追加しましたか? –

+0

doc(https://docs.djangoproject.com/en/1.11/ref/settings/#allowed-hosts)によると - DEBUGがTrueでALLOWED_HOSTSが空の場合、ホストは[localhost '、' 127.0 .0.1 '、' [:: 1] ']。 DEBUGをTrueに設定しました。 –

+0

私はそのコメントを削除しました。私はそれを求めることを意味しませんでした。更新されたものをご覧ください。 –

答えて

0

コードの問題ではなく、マイナーな設計上の問題であることがわかりました。 oauth2リクエストをクライアントに送信するロジックを分離し、oauth2リクエストの後に、paramsオプションを使用して内部APIにリクエストを送信しました。そして今、それは正常に動作しています。

関連する問題