0

このプロジェクトはGoogle Appengineクラウドエンドポイントフレームワーク上にあります。 バックエンドのPython。 私はまたendpoints_proto_datastore(それが違いを作るかどうかわからない)javascriptアプリケーションがGoogleクラウドエンドポイントにアクセスしようとすると、401エラーが発生する

ここでは私のhtmlファイルで使用している -

<html> 
<body> 

<script> 

clientId = 'myclientid-something-something-something.apps.googleusercontent.com' 
loginScope = 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/admin.directory.user.readonly https://www.googleapis.com/auth/admin.directory.customer.readonly https://www.googleapis.com/auth/gmail.settings.basic';   
apiKey = 'my-api-key-from-cloud-console'; 

doSignIn = function() { 
    console.log("calling doSignIn"); 
    gapi.client.init({apiKey: apiKey, clientId: clientId,scope: loginScope}).then(renderSignIn); 
} 

renderSignIn = function(){ 
       gapi.signin2.render('my-signin', { 
       'scope': loginScope, 
       'width': 'inherit', 
       'height': 50, 
       'longtitle': true, 
       'theme': 'light', 
       'onsuccess': getOfflineAccess, 
       'onfailure': function(){console.log("error")} 
      }); 
}; 

getOfflineAccess =function(){ 
    console.log("calling getOfflineAccess"); 
    gapi.auth2.getAuthInstance().grantOfflineAccess({'redirect_uri': 'postmessage'}).then(getApiAuthorization); 
} 
getApiAuthorization = function(){ 
    console.log("calling getApiAuthorization"); 
    gapi.auth.authorize({client_id: clientId,scope: loginScope, immediate: false},singedInCallback); 
}; 
singedInCallback = function(authResponse) { 
    console.log("calling signInCallback"); 
    gapi.client.endpointsapp.userOfflineAccessCode.insert({'auth_code':authResponse.code}) 
      .then( function(){console.log("success");}, 
        function(){console.log("error");} 
       ); 
}; 



init = function() { 
    console.log("calling init"); 
    var apisToLoad; 
    var callback = function() { 
    if (--apisToLoad == 0) { 
     doSignIn(); 
    } 
    } 
    apisToLoad = 2; 
    gapi.client.load('endpointsapp','v1',callback,"https://endpointsapp.appspot.com/_ah/api"); //dummy name for app 
    gapi.load('client:auth2', callback); 
}; 

</script> 
<div id="my-signin"></div> 

    <script src="https://apis.google.com/js/api.js?onload=init"></script> 
    <script src="https://apis.google.com/js/client.js?onload=init"></script> 
    <script src="https://apis.google.com/js/platform.js"></script> 

</body> 
</html> 

すべてが最初で、滑らかになります。 私はGoogleの署名ボタンを取得します。 これをクリックすると、必要なすべての権限が与えられます。 実際のAPIヒットが行われたとき。つまり私がAPI(gapi.client.endpointsapp.userOfflineAccessCode.insert)から取得401

応答を与える:

{ 
"error": { 
    "code": 401, 
    "errors": [ 
    { 
    "domain": "global", 
    "message": "Invalid token.", 
    "reason": "required" 
    } 
    ], 
    "message": "Invalid token." 
} 
} 

私はGoogleのAPIエクスプローラを使用して、同じAPIエンドポイントをしようとすると私が認証されていれば、何も問題なく動作します。

私は1日中これをデバッグしようとしていますが、私が間違っていることを理解できません。

ご協力いただきまして誠にありがとうございます。

答えて

0

ok問題が見つかりました。非常に基本的な間違い。

https://cloud.google.com/endpoints/docs/frameworks/python/create_apiによると、APIが認証を使用する場合、allowed_client_idsは必須フィールドです。私はこのパラメータを提供しておらず、APIがデフォルトですべてのclient_idsに利用可能であることを期待していました。

関連する問題