edit-icon download-icon

Add a signature to a URL

最終更新日: Jul 31, 2019

権限付与済みアクセスを実装するには、Authorization ヘッダーを使用するほかに、URL に署名情報を追加してサードパーティに転送することもできます。

実装方法

署名を含む URL の例:

  1. http://oss-example.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?AccessKeyId=AccessKeyId&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D

URL の署名には、少なくとも、Signature、Expires、OSSAccessKeyId の 3 つのパラメーターが含まれている必要があります。

  • Expires: URL のタイムアウト時間を示します。このパラメーターの値は UNIX 時間です (1970 年 1 月 1 日午前 0 時 0 分 0 秒 (UTC) からの経過秒数。詳細については Wikipedia を参照)。OSS が URL リクエストを受信した時刻が、署名に含まれている Expires パラメーターの値より遅かった場合は、リクエストがタイムアウトしたことを示すエラーコードが返されます。たとえば、現在の時刻が 1141889060 である場合に、60 秒後に自動的に無効になる URL を作成するには、Expires の値を 1141889120 に設定します。
  • OSSAccessKeyId: Access Key ID を示します。
  • Signature: 署名情報を示します。OSS では、さまざまなリクエストとヘッダーパラメーターがサポートされていますが、URL に署名を追加するためのアルゴリズムは、ヘッダーへの署名の追加のアルゴリズムと基本的に同じです。

    1. Signature = urlencode(base64(hmac-sha1(AccessKeySecret,
    2. VERB + "\n"
    3. + CONTENT-MD5 + "\n"
    4. + CONTENT-TYPE + "\n"
    5. + EXPIRES + "\n"
    6. + CanonicalizedOSSHeaders
    7. + CanonicalizedResource)))

    違いは次のとおりです。

    • 署名が URL に追加されると、Date パラメーターが Expires パラメーターに置き換えられます。
    • 署名を URL とヘッダーに同時に含めることはできません。
    • 複数の受信Signature、Expires、またはAccessKeyId値が使用可能な場合は、最初の値が使用されます。
    • リクエストの時刻が Expires の時刻より遅いかどうかは署名の前に検証されます。
    • 署名文字列をURLに挿入するときは、URLのUrlEncodeを必ず実行してください。
  • 一時的なユーザーのURLに署名を追加する場合は、「security-token」を指定する必要があります。 形式は次のとおりです。
    1. http://oss-example.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?AccessKeyId=AccessKeyId&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D&security-token=SecurityToken

サンプルコード

URL に署名を追加する Python コードの例:

  1. import base64
  2. import hmac
  3. import sha
  4. import urllib
  5. h = hmac.new("OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV",
  6. "GET\n\n\n1141889120\n/oss-example/oss-api.pdf",
  7. sha)
  8. urllib.quote (base64.encodestring(h.digest()).strip())

注意:

  • 上記はPythonのサンプルコードです。
  • OSS SDKは、URLに署名を追加する方法を提供します。 使用方法については、SDKファイルの「アクセス許可」を参照してください。
  • OSS SDKのURLに署名を追加する実装については、下記の表を参照してください。
SDK URL署名方式 実装ファイル
Java SDK OSSClient.generatePresignedUrl OSSClient.java
Python SDK Bucket.sign_url api.py
.Net SDK OssClient.GeneratePresignedUri OssClient.cs
PHP SDK OssClient.signUrl OssClient.php
JavaScript SDK signatureUrl object.js
C SDK oss_gen_signed_url oss_object.c

詳細分析

  • URL に署名を追加する方法を使用する場合、権限付与済みのデータは、有効期限が切れる前にインターネットで公開されます。この方法を使用する際にはセキュリティーを配慮した上で利用してください。
  • URL に署名を追加する方法は、PUT と GET の両方のリクエストでサポートされています。
  • 署名が URL に追加されると、Signature、Expires、OSSAccessKeyId の順序が変更される場合があります。Signature、Expires、OSSAccessKeyId の各パラメーターがすべて揃っていないと、エラー 403 Forbidden が返されます。エラーコードは AccessDenied です。
  • 現在のアクセス時刻がリクエストの Expires の設定時刻より遅い場合は、エラー 403 Forbidden が返されます。エラーコードは AccessDenied です。
  • Expires の時刻の形式が正しくない場合は、エラー 403 Forbidden が返されます。エラーコードは AccessDenied です。
  • URL に Signature、Expires、OSSAccessKeyId の各パラメーターが 1 つ以上含まれている場合に、ヘッダーに署名情報が含まれていると、エラー 400 Bad Request が返されます。エラーコードは InvalidArgument です。
  • 署名文字列が生成されると、Date パラメーターが Expires パラメーターに置き換えられますが、前のセクションで説明した content-type や content-md5 などのヘッダーはそのまま含まれます (Date リクエストヘッダーはまだリクエストに存在するため、署名文字列に Date ヘッダーを追加する必要はありません)。