4

サービスベースの認証を使用してGCSにアクセスするPythonスクリプトを作成しようとすると、次のことがわかりました。'key'は私のp12ファイルの内容であることに注意してください。

アカウントのバケットのリストを読み込もうとしています。GCSへのWebインターフェイスを使用して1つのバケットを正常に作成しましたが、gsutilでそれを確認できます。

以下のコードを実行すると、403エラーが発生します。最初は正しく認証されていないと思っていましたが、この非常に便利なWebページ(Webベースの認証を使用)から試してみましたが、正しく機能します。https://developers.google.com/apis-explorer/#p/storage/v1beta1/storage.buckets.list?projectId=&_h = 2&

ヘッダーとクエリ文字列を見て、それらをウェブサイトで生成されたリクエストのキーダーとクエリと比較すると、承認ヘッダーがなく、クエリ文字列にkey=タグがないことがわかります。私は、資格認定が私のためにこれを処理していただろうと思ったと思います。

私は何が間違っているのですか?

コード:

credentials = SignedJwtAssertionCredentials(
      'xxx-my-long-email-from-the-console@developer.gserviceaccount.com',
      key,
      scope='https://www.googleapis.com/auth/devstorage.full_control')
http = httplib2.Http()
http = credentials.authorize(http)

service = build("storage", "v1beta1", http=http)

# Build the request

request = service.buckets().list(projectId="159910083329")

# Diagnostic

pprint.pprint(request.headers)
pprint.pprint(request.to_json())

# Do it!

response = request.execute()

実行しようとすると、403が表示されます。

4

1 に答える 1

3

私はこれを機能させました、しかし、私が使用したコードはあなたが投稿したスニペットと根本的に違いはありません。私のバージョンとあなたのバージョンを比較したい場合に備えて、以下に添付されているのは、私のために機能したPythonプログラムの完全なコピーです。私は最初、あなたと同じように403を取得しました。これは、プロジェクトIDを継承したためです:)。プロジェクトIDを使用するようにその値を更新した後、正しいバケットリストを取得しました。チェックする2つのこと:

  1. 使用しているプロジェクトIDが正しく、GoogleDeveloperConsoleの[サービス]タブで[GoogleCloudStorage JSON API]が有効になっていることを確認してください(他のGoogle Cloud Storage APIとは異なるサービスです)。

  2. 開発者のコ​​ンソールから取得したものとまったく同じように、サービスアカウントの秘密鍵をロードしていることを確認してください。コード内の文字列リテラルにコピーするのではなく、ここで行ったように、ダウンロードしたファイルからメモリに読み込むことをお勧めします。


#!/usr/bin/env python

import pprint
import oauth2client
from oauth2client.client import SignedJwtAssertionCredentials
import httplib2
from apiclient.discovery import build

f = open('key.p12', 'r')
key = f.read()
f.close()

credentials = SignedJwtAssertionCredentials(
      'REDACTED',
      key,
      scope='https://www.googleapis.com/auth/devstorage.full_control')
http = httplib2.Http()
http = credentials.authorize(http)

service = build("storage", "v1beta1", http=http)

# Build the request

request = service.buckets().list(projectId="REDACTED")

# Diagnostic

pprint.pprint(request.headers)
pprint.pprint(request.to_json())

# Do it!

response = request.execute()
pprint.pprint(response)
于 2012-12-04T16:54:38.470 に答える