13

「署名付き URL」を使用して、ファイルにアクセスしたり、Google Cloud Storage (GCS) にファイルをアップロードしたりしようとしています。

https://developers.google.com/storage/docs/accesscontrol#Signing-Stringsの指示に従いました

私がしたこと:

  • Google Cloud Console に「ウェブ アプリケーション」を登録しました。
  • 登録したWebアプリケーション画面の「証明書」セクションにある「新しい鍵を生成する」を使用して、新しい秘密鍵を生成します。
  • 署名する文字列を作成し、ページの「署名方法」セクションで提供されているサンプル コードを使用して署名します (Java メイン プログラムの値をハードコードするための微調整のみ)。更新: GcsSigner.javaの要旨を作成しました。
  • 署名付き文字列が URL エンコードされていることを確認してください。
  • 指定された HTTP ヘッダー: x-goog-api-version、x-goog-project-id、Content-Type。
  • 指定された URL パラメータ: GoogleAccessId、Signature、Expires。
  • Postman (Chrome 拡張機能) を使用して、PUT 要求をシミュレートします。

ただし、私はまだこれを取得しています (ステータス: 403 Forbidden):

<?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

text/plain
1384084959392
x-goog-api-version:2
x-goog-project-id:99999
/mybucket/myfile.txt</StringToSign>
</Error>

「StringToSign」の値に基づいて文字列に署名して再試行しても、同じエラーが発生します。

ここで関連するさまざまな投稿を読んでくださいx-goog-api-version:1

私は何が欠けていますか?どんな助けでも大歓迎です。

4

5 に答える 5

10

最後に、署名付き URL を使用して Google Cloud Storage にファイルを PUT することができました。これは、シミュレートする単純な Java プログラムを作成することによって行われました。

  • Server文字列を署名として署名およびエンコードします。
  • Uploaderによって提供された署名のみを使用して PUT 要求を送信する認証されていないユーザーとしてServer。ブラウザーは、Apache の HTTP クライアント ライブラリを使用してシミュレートされます。

デモアプリはこちらからご覧いただけます。

Chrome の Postman 拡張機能を介して送信したときになぜ機能しなかったのか、よくわかりません。

于 2013-11-15T01:58:56.403 に答える
2

PUT と署名付き URL (GAE Cloud Endpoints を使用) に苦労していましたが、次の 2 つのことを行う必要がありました。

  1. 最新の GAE gradle 依存関係があることを確認してください。自動生成されたものですが、android studio は常に最新であるとは限りません。
  2. PUT の場合、署名する文字列を次のようにする必要があります。

    文字列 url_signature = sign(動詞 + "\n" + contentMD5 + "\n" + contentType + "\n" + 有効期限 + "\n" + "/" + BUCKET_NAME + "/" + objectName );

ここで説明されているように: https://cloud.google.com/storage/docs/access-control/signed-urls形式は次のとおりです。

StringToSign = HTTP_Verb + "\n" +
               Content_MD5 + "\n" +
               Content_Type + "\n" +
               Expiration + "\n" +
               Canonicalized_Extension_Headers +
               Canonicalized_Resource

これらの戻り値 "\n" は重要です。多すぎたり少なすぎたりすると、そのエラーが発生します。たとえば、contentMD5 を渡さない場合は、空の文字列を渡すだけで、正しい数の "\n" が返されます。

于 2016-05-07T22:41:54.297 に答える
1

コードを調べて、次のヘッダーを省略してstringToSignを作成してみてください-

"x-goog-api-version:2\n" +
"x-goog-project-id:1234\n" +

以下に示すように -

 String stringToSign = "PUT\n" +
                "\n" +
                "text/plain\n" +
                "1384084959392\n" +
                "/test-bucket/bob.txt";

次に、Sign URL を生成してみます。

ありがとう

于 2013-11-13T06:20:37.413 に答える