1

この質問は基本的に、ここで見つけることができる以前の質問の続きです。発生したエンコーディング エラーに対処した後、新しい HttpError 401 の問題に遭遇しました。私の開発アプリ サーバー ログからのトレースは次のとおりです。

ERROR    2012-12-20 03:10:46,312 pipeline.py:2237] Generator main.CloudStorageToBigQuery(*([u'/gs/jibdancsvtest/Datastore Mapper main.streamdata-1582389642294FE5DBBCE-output'],), **{})#2d3dba4f4a5211e2bf0ac3cee1488e47 raised exception. HttpError: <HttpError 401 when requesting https://www.googleapis.com/bigquery/v2/projects/1093XXXXXXXXX/jobs?alt=json returned "Invalid Credentials">
Traceback (most recent call last):
  File "C:\Users\Tank\Documents\Aptana Studio 3 Workspace\jibdantest-bq\mapreduce\lib\pipeline\pipeline.py", line 2030, in evaluate
    self, pipeline_key, root_pipeline_key, caller_output)
  File "C:\Users\Tank\Documents\Aptana Studio 3 Workspace\jibdantest-bq\mapreduce\lib\pipeline\pipeline.py", line 1064, in _run_internal
    return self.run(*self.args, **self.kwargs)
  File "C:\Users\Tank\Documents\Aptana Studio 3 Workspace\jibdantest-bq\main.py", line 77, in run
    result.execute()
  File "C:\Users\Tank\Documents\Aptana Studio 3 Workspace\jibdantest-bq\oauth2client\util.py", line 120, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "C:\Users\Tank\Documents\Aptana Studio 3 Workspace\jibdantest-bq\apiclient\http.py", line 678, in execute
    raise HttpError(resp, content, uri=self.uri)
HttpError: <HttpError 401 when requesting https://www.googleapis.com/bigquery/v2/projects/1093XXXXXXXXX/jobs?alt=json returned "Invalid Credentials">

URLからのjson応答を投稿することも考えました。そのjsonは次のとおりです。

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "required",
    "message": "Login Required",
    "locationType": "header",
    "location": "Authorization"
   }
  ],
  "code": 401,
  "message": "Login Required"
 }
}

ここで、stackoverflow に関する以前の質問へのリンクをたどると、私の main.py ファイルにすべてを実行するコードが見つかります。しかし、ここに再投稿する必要がある場合は、それを行うことができます。

だから、私はそれが OAuth の問題だと思っていますが、すべてが適切に設定されていると信じています。私ができる/調査できる他のことについての提案は素晴らしいでしょう。

よろしくお願いします。

4

2 に答える 2

2

ローカル dev サーバーで実行する場合は、資格情報を別の方法で設定する必要があります。

まず、ローカル資格情報ストアをセットアップする必要があります。ここから get_refresh_token.py を使用します: https://codereview.appspot.com/5362041/diff/1/samples/oauth2cmdline/get_refresh_token.py

Google API コンソールで Web アプリケーションのクライアント ID をセットアップし、パラメーターを上記のスクリプトに渡します (OAuth2 認証用のブラウザーが起動します)。これにより、資格情報を含むローカル ファイルが作成され、認証されたリクエストのために API クライアントに渡すことができます。

from oauth2client.client import Storage, Credentials
from oauth2client.appengine import AppAssertionCredentials

class FileStorage(Storage):
    def __init__(self, filepath):
        self._filepath = filepath

    def locked_get(self):
        with open(self._filepath, 'r') as f:
            json = f.read()
        credentials = Credentials.new_from_json(json)
        return credentials

if not os.environ.get('SERVER_SOFTWARE', '').startswith('Development'):
    credentials = AppAssertionCredentials(scope='https://www.googleapis.com/auth/bigquery')
else:
    filepath = #Path to credentials file here
    storage = FileStorage(filepath)
    credentials = storage.get()

お役に立てれば!

于 2013-01-15T14:23:25.580 に答える
1

ジョブを実行するための適切な権限があるかどうかを確認する必要がある場合があります。同様の問題に遭遇し、ジョブを実行するには所有者のアクセス許可が必要であることがわかりました。

それが役に立てば幸い!

于 2012-12-26T23:29:39.483 に答える