プログラムを使用した署名済み URL の作成

このページでは、署名付き URL をプログラムで作成する方法について説明します。署名付き URL は、バケットやオブジェクトのクエリ文字列を認証するためのメカニズムです。署名付き URL は、バケットとオブジェクトへのアクセスを制御するための方法の 1 つです。署名付き URL は、バケットやオブジェクトに関連付けられ、特定のリソースへの制限時間付きの読み取りアクセスや書き込みアクセスを可能にします。Google アカウントを持っているかどうかにかかわらず、URL を持っている人なら誰でも URL によりアクセスが許可されます。

署名付き URL の詳細は、署名付き URL の概要をご覧ください。gsutil を使って署名付き URL を簡単に作成する方法については、gsutil を使用した署名済み URL の作成をご覧ください。

プログラムによる署名付き URL の作成

署名付き URL を生成するプログラムは、さまざまな言語で作成できます。そのようなプログラムでは、署名付き URL を生成するためのステップを実装する必要があります。以下に概要を示します。

  1. 新しい秘密鍵を生成するか、サービス アカウント用の既存の秘密鍵を使用します。鍵は、JSON 形式か PKCS12 形式のものを使用できます。

    秘密鍵とサービス アカウントの詳細については、サービス アカウントをご覧ください。

  2. 署名する文字列を作成します。

    1. 署名付き URL を使うリクエストが使用する必要がある HTTP_Verb(GETPUTDELETE など)を選択します。

    2. 署名付き URL を使うリクエストに MD5 ダイジェスト値を含める場合は、その値を追加します。

    3. 署名付き URL を使うリクエストに Content-Type ヘッダーを含める場合は、オブジェクトの Content-Type を指定します。

    4. 署名付き URL の期限が切れる(つまり、関連付けられたオブジェクトへのアクセスができなくなる)タイムスタンプ(Unix Epoch からの経過秒数)を指定します。

    5. 署名付き URL を使用するリクエストに拡張ヘッダーを含める場合は、拡張ヘッダーを改行で区切って指定します。ただし、x-goog-encryption-key ヘッダーや x-goog-encryption-key-sha256 ヘッダーは、関連するオブジェクトへのアクセス リクエストでそれらのヘッダーが使用される場合でも指定しないでください。

    6. バケットレベルから始まるリソースへのパスを指定します。

    この文字列の構成要素それぞれについて説明した表が、署名付き URL の概要のページにあります。

    必須の構成要素のみを含む署名文字列は、次のようになります(改行が、\n ではなく実際の改行として示されていることに注意してださい)。

    GET
    
    1388534400
    /bucket/objectname
    

    また、次の署名文字列にはすべての構成要素が含まれ、顧客指定の暗号鍵を使用したオブジェクトに適用されます(改行が \n ではなく実際の改行として示されていることに注意してください)。

    GET
    rmYdCNHKFXam78uCt7xQLw==
    text/plain
    1388534400
    x-goog-encryption-algorithm:AES256
    x-goog-meta-foo:bar,baz
    /bucket/objectname
    
  3. 文字列に署名します。

    文字列に署名するためには、OAuth クライアント ID と、このガイドの最初のステップで説明したサービス アカウント タイプ アプリケーションの秘密鍵が必要です。

    リクエストを認証するには、作成した文字列に RSA 署名と SHA256 を使用して署名します。

    たとえば、Python では、次のコードを使って文字列を署名できます。

    from oauth2client.service_account import ServiceAccountCredentials
    creds = ServiceAccountCredentials.from_json_keyfile_name([KEY_FILENAME])
    client_id = creds.service_account_email
    signature = creds.sign_blob([SIGNATURE_STRING])[1]
    

    ここで

    • [KEY_FILENAME] は秘密鍵が格納されたファイル名です。
    • [SIGNATURE_STRING] は署名用に作成した文字列です。

    Google App Engine アプリケーションの中で、App Engine App Identity サービスを使って文字列を署名できます。

  4. 署名を Base64 エンコードします。

    たとえば、Python では、次のコードを使用して署名をエンコードできます。

    encoded_signature = base64.b64encode(signature)
    
  5. URL を作成します。

    クエリ文字列を作成して署名した後、次のようにして URL を作成します。

    1. リソースを参照するベース URL を作成します。署名したクエリ文字列と同じ値を使用してください。次に例を示します。

      https://storage.googleapis.com/google-testbucket/testdata.txt
    2. 作成した署名の文字を必要に応じてエンコードし、URL で使用できるようにします。

      Base64 でエンコードされた署名には、URL で使用できない文字(具体的には +/)が含まれている可能性があります。これらの値は、安全なエンコーディング(それぞれ %2B%2F)で置き換える必要があります。

    3. 配布したい URL を以下のようにして結合します。

      BASE_URL + "?GoogleAccessId=" + GOOGLE_ACCESS_STORAGE_ID + "&Expires=" + EXPIRATION + "&Signature=" + URL_ENCODED_SIGNATURE
      

      ここで

      • BASE_URL には、パート a で作成した URL を含めます。
      • GOOGLE_ACCESS_STORAGE_ID には、メール形式のクライアント ID を含めます。
      • EXPIRATION には、署名したクエリ文字列で使用したのと同じ値を含めます。
      • URL_ENCODED_SIGNATURE には、パート b でエンコードした署名を含めます。

    完成した URL の例は次のとおりです。

    https://storage.googleapis.com/google-testbucket/testdata.txt?GoogleAccessId=
    1234567890123@developer.gserviceaccount.com&Expires=1331155464&Signature=BCl
    z9e4UA2MRRDX62TPd8sNpUCxVsqUDG3YGPWvPcwN%2BmWBPqwgUYcOSszCPlgWREeF7oPGowkeKk
    7J4WApzkzxERdOQmAdrvshKSzUHg8Jqp1lw9tbiJfE2ExdOOIoJVmGLoDeAGnfzCd4fTsWcLbal9
    sFpqXsQI8IQi1493mw%3D

トップへ戻る

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Storage ドキュメント