GCSPUTリクエスト用のPythonを使用したGAEの署名付きURL

hamx0r

Google Cloud Storage(GCS)にファイルを直接アップロードするために使用する署名付きURLを作成しようとしています。ポリシーを利用するこのGithubの例を使用して、POSTを使用してこれを機能させました。ベストプラクティスに従ってPUTを使用するようにリファクタリングしSignatureDoesNotMatchエラーが発生します。

<?xml version='1.0' encoding='UTF-8'?><Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method.</Message><StringToSign>PUT


123456789
/mybucket/mycat.jpg</StringToSign></Error>

プログラムGCPのサンプルPythonコードを使用して署名付きURLを作成するためのドキュメントに従って、私はこのプロセスを実行しています。

  1. 署名文字列を作成する
  2. それに署名する
  3. それをエンコードするbase64
  4. 結果をエンコードするurl(Pythonの例ではこれは行われません...

これはGoogleApp Engine(GAE)アプリで実行されているため、サービスアカウントユーザーのJSONキーファイルを取得する必要はありませんが、App IdentityServicesを使用して署名します。これがFlaskプロジェクト内の私のコードです:

google_access_id = app_identity.get_service_account_name()
expires = arrow.utcnow().replace(minutes=+10).replace(microseconds=0).timestamp
resource = '/mybucket/mycat.jpg'

args = self.get_parser.parse_args()
signature_string = 'PUT\n'
# take MD5 of file being uploaded and its content type, if provided
content_md5 = args.get('md5') or ''
content_type = args.get('contenttype') or ''
signature_string = ('PUT\n'
                    '{md5}\n'
                    '{content_type}\n'
                    '{expires}\n'
                    '{resource}\n').format(
                    md5=content_md5,
                    content_type=content_type,
                    expires=expires,
                    resource=resource)
log.debug('signature string:\n{}'.format(signature_string))
_, signature_bytes = app_identity.sign_blob(signature_string)
signature = base64.b64encode(signature_bytes)
# URL encode signature
signature = urllib.quote(signature)
media_url = 'https://storage.googleapis.com{}'.format(resource)
return dict(GoogleAccessId=google_access_id,
            Expires=expires,
            Signature=signature,
            bucket='mybucket',
            media_url='{}?GoogleAccessId={}&Expires={}&Signature={}'.format(media_url, google_access_id, expires, signature))

このlog.debugステートメントは、上記のGCSXMLエラー応答の署名と完全に一致する署名ファイルを出力します。それらが一致する場合、なぜアップロードできないのですか?

gsutil使用すると、同じGAEサービスアカウントを使用して署名付きURLを作成でき、Postmanで正常に機能します。gsutilURLエンコードされた署名が表示されますが、独自の署名付きURLを作成する場合、どちらの方法でも問題はないようです。GCSはPUTリクエストを受け取り、表示されている署名が自分の署名と一致していても、署名が一致しないと文句を言います。ログに記録されたデバッグメッセージ。また、元の署名文字列の末尾に\ nがある場合とない場合も試しました。

編集:POST私は、その後の例それは歌う前にBase64では、ポリシーをコードしそして再び、それはそれに署名した後。PUT署名の作成でこのアプローチを試しましたが、違いはありませんでした

hamx0r

答えは、Content-Typeヘッダーを使用する必要があることを指摘して、SOや他の場所で見つかった他の答えに非常に近いものでした。これは部分的には真実ですが、私の主な問題によって影が薄くなっています。私は、GCSに対して読み取りと書き込みができると想定した「エディター」のアクセス許可を持つデフォルトのGAEサービスアカウントに依存していました。私はそのアカウントからキーファイルを作成し、それを使用して、gsutilこの手がかりを与えました。

[email protected] does not have permissions on gs://mybucket/cat.jpg, using this link will likely result in a 403 error until at least READ permissions are granted

そこにファイルを配置しようとするとGCSからエラーが発生するのは正しかったのですが、それは404エラーではなくSignatureDoesNotMatch、質問に示されているエラーでした

解決策は2つの部分でした:

  1. デフォルトのGAEサービスアカウントに、「ストレージ」の権限セットからより多くの権限を付与します。
    1. ストレージオブジェクトクリエーター
    2. ストレージオブジェクトビューア
  2. Content-TypeファイルをGCSにPUTするときは、必ずヘッダーを使用してください。署名する署名文字列で指定しなくても、デフォルトでtext/plainヘッダーで指定する必要があります

最後に、アカウントに正しいアクセス許可を追加した後でも、IAMコンソールから新しいJSONキーファイルを作成するまで、gsutilで警告が表示されました。さらに、GSutilと古いキーファイルで作成された署名付きURLはSignatureDoesNotMatch、IAMコンソールでアクセス許可が設定されていても機能しませんでした(エラー)。GAEで実行されているPythonコードは、更新なしで正常に機能しました。IAMで設定されたアクセス許可と、コンテンツヘッダーを一致させるだけで済みました。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

golang:SSEを使用したS3オブジェクトの署名付きURLのGETリクエストが403エラーで失敗する

分類Dev

lamdaを使用したS3画像アップロードの署名付きURLでの `PUT`リクエストの403

分類Dev

C#+ Google Storageの署名付きURL:計算したリクエストの署名が指定した署名と一致しません

分類Dev

Xcode9を使用した開発者ID署名付きアプリバンドルのエクスポート

分類Dev

429 aws-sdkを使用してs3オブジェクトの署名付きURLを生成するときにリクエストが多すぎる

分類Dev

Python を使用した GAE の @cached_property を使用したリクエスト ハンドラー

分類Dev

署名された書き込み可能なURLのエラー:計算したリクエストの署名が、指定した署名と一致しません

分類Dev

Jestを使用したテスト用の名前付きエクスポートのモック

分類Dev

InvokeHTTPを使用したヘッダー付きのNi-FiGetリクエスト

分類Dev

認証付きのJMeterを介したSOAPリクエスト

分類Dev

拡張子付きのOpenSSL署名リクエスト

分類Dev

C#を使用して署名済みのリクエストInstagramを適用する

分類Dev

パラメータ付きのSLRequestを使用したTwitterリクエストからのエラー32

分類Dev

HelloJSを使用してTumblrAPIにOAuth1.0a署名付きリクエストを作成するのに問題がある

分類Dev

Python boto3を使用して、v4署名付きのS3署名付きURLを生成します

分類Dev

Pythonを使用した自己署名証明書付きのSSL

分類Dev

javascriptを使用した外部URLへのAjaxリクエスト

分類Dev

リクエストライブラリを使用したカスタムヘッダー付きのPOST

分類Dev

AWSS3-事前に署名されたURLを介してファイルをPUTするときに400の不正なリクエスト

分類Dev

Apache HttpComponentsクライアントを使用したAWS HTTPリクエストの署名

分類Dev

Python3のAPIで使用するjwtをリクエストするための署名

分類Dev

Pythonリクエストを使用したSOAPリクエストの送信

分類Dev

自己署名証明書を使用してPythonでリクエストを使用すると、証明書の検証に失敗しました

分類Dev

条件付きステートメントを使用したSASSQLのサブクエリ

分類Dev

teraformを介してGoogleストレージオブジェクトの署名付きURLを取得します

分類Dev

Pythonのチャンクを使用したGETリクエスト

分類Dev

文字列連結を使用したクエリ用の2つのvarchar列のインデックス付け

分類Dev

AWS SDK for.NETを使用したAPIGateway署名リクエスト

分類Dev

CloudFront署名付きURLへのアクセスが拒否されました

Related 関連記事

  1. 1

    golang:SSEを使用したS3オブジェクトの署名付きURLのGETリクエストが403エラーで失敗する

  2. 2

    lamdaを使用したS3画像アップロードの署名付きURLでの `PUT`リクエストの403

  3. 3

    C#+ Google Storageの署名付きURL:計算したリクエストの署名が指定した署名と一致しません

  4. 4

    Xcode9を使用した開発者ID署名付きアプリバンドルのエクスポート

  5. 5

    429 aws-sdkを使用してs3オブジェクトの署名付きURLを生成するときにリクエストが多すぎる

  6. 6

    Python を使用した GAE の @cached_property を使用したリクエスト ハンドラー

  7. 7

    署名された書き込み可能なURLのエラー:計算したリクエストの署名が、指定した署名と一致しません

  8. 8

    Jestを使用したテスト用の名前付きエクスポートのモック

  9. 9

    InvokeHTTPを使用したヘッダー付きのNi-FiGetリクエスト

  10. 10

    認証付きのJMeterを介したSOAPリクエスト

  11. 11

    拡張子付きのOpenSSL署名リクエスト

  12. 12

    C#を使用して署名済みのリクエストInstagramを適用する

  13. 13

    パラメータ付きのSLRequestを使用したTwitterリクエストからのエラー32

  14. 14

    HelloJSを使用してTumblrAPIにOAuth1.0a署名付きリクエストを作成するのに問題がある

  15. 15

    Python boto3を使用して、v4署名付きのS3署名付きURLを生成します

  16. 16

    Pythonを使用した自己署名証明書付きのSSL

  17. 17

    javascriptを使用した外部URLへのAjaxリクエスト

  18. 18

    リクエストライブラリを使用したカスタムヘッダー付きのPOST

  19. 19

    AWSS3-事前に署名されたURLを介してファイルをPUTするときに400の不正なリクエスト

  20. 20

    Apache HttpComponentsクライアントを使用したAWS HTTPリクエストの署名

  21. 21

    Python3のAPIで使用するjwtをリクエストするための署名

  22. 22

    Pythonリクエストを使用したSOAPリクエストの送信

  23. 23

    自己署名証明書を使用してPythonでリクエストを使用すると、証明書の検証に失敗しました

  24. 24

    条件付きステートメントを使用したSASSQLのサブクエリ

  25. 25

    teraformを介してGoogleストレージオブジェクトの署名付きURLを取得します

  26. 26

    Pythonのチャンクを使用したGETリクエスト

  27. 27

    文字列連結を使用したクエリ用の2つのvarchar列のインデックス付け

  28. 28

    AWS SDK for.NETを使用したAPIGateway署名リクエスト

  29. 29

    CloudFront署名付きURLへのアクセスが拒否されました

ホットタグ

アーカイブ