2

AppEngineからGooglePredictionAPIにアクセスしようとしていますが、こちらの手順に従って ください-https://developers.google.com/appengine/articles/prediction_service_accounts

これは、AppEngineにデプロイするとうまく機能します。ただし、同じコードが失敗し、ローカル開発サーバーで次のエラーが発生します。

credentials = AppAssertionCredentials(
              scope='https://www.googleapis.com/auth/prediction')
http = credentials.authorize(httplib2.Http(memcache))
service = build("prediction", "v1.5", http=http, developerKey=api_key)

ERROR    2012-12-28 03:48:53,084 client.py:461] Failed to retrieve access token: {
  "error" : "invalid_grant"
}
ERROR    2012-12-28 03:48:53,115 cgi.py:121] Traceback (most recent call last):
  File "/Users/gkedia/git/thirdgaze/main.py", line 83, in <module>
    service = build('prediction', 'v1.5', http=http, developerKey=api_key)
  File "/Users/gkedia/git/thirdgaze/apiclient/discovery.py", line 175, in build
    resp, content = http.request(requested_url)
  File "/Users/gkedia/git/thirdgaze/oauth2client/client.py", line 503, in new_request
    self._refresh(request_orig)
  File "/Users/gkedia/git/thirdgaze/oauth2client/client.py", line 412, in _refresh
    self._do_refresh_request(http_request)
  File "/Users/gkedia/git/thirdgaze/oauth2client/client.py", line 472, in _do_refresh_request
    raise AccessTokenRefreshError(error_msg)
AccessTokenRefreshError: invalid_grant

私が気づいたことの1つは、まったく同じパラメーターについてで key_name, signature = app_identity.sign_blob(base_str)あり、本番環境とローカルマシンで異なる署名を返します。

コンピューターの時刻が正しく同期されており、offline_accessパラメーターがまだ含まれていないようです。

4

1 に答える 1

3

app_identityより一般的には、サービス アカウントは機能しません。ローカルでテストするときに、通常の Google アカウントに関連付けられたアクセス トークンを取得するには、通常のoauth2 ウェブサーバー フローdev_appserverをフォールバックする必要があります。

何かのようなもの:

flow = OAuth2WebServerFlow(client_id='your_client_id',
                           client_secret='your_client_secret',
                           scope='https://www.googleapis.com/auth/prediction',
                           redirect_uri='http://localhost:8080/oauth2callback')
self.redirect(flow.step1_get_authorize_url())

そして、/oauth2callbackハンドラーで:

credentials = flow.step2_exchange(self.request.get('code'))
http = credentials.authorize(httplib2.Http(memcache))
service = build("prediction", "v1.5", http=http, developerKey=api_key)

で実行しているか、環境変数dev_appserverを使用して本番環境で実行しているかを簡単に検出できます。SERVER_SOFTWARE

于 2013-01-02T21:24:10.647 に答える