権限付与済みアクセスを実装するには、Authorization ヘッダーを使用するほかに、URL に署名情報を追加してサードパーティに転送することもできます。
実装方法
署名を含む URL の例:
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 に署名を追加するためのアルゴリズムは、ヘッダーへの署名の追加のアルゴリズムと基本的に同じです。
Signature = urlencode(base64(hmac-sha1(AccessKeySecret,
VERB + "\n"
+ CONTENT-MD5 + "\n"
+ CONTENT-TYPE + "\n"
+ EXPIRES + "\n"
+ CanonicalizedOSSHeaders
+ CanonicalizedResource)))
違いは次のとおりです。
- 署名が URL に追加されると、Date パラメーターが Expires パラメーターに置き換えられます。
- 署名を URL とヘッダーに同時に含めることはできません。
- 複数の受信Signature、Expires、またはAccessKeyId値が使用可能な場合は、最初の値が使用されます。
- リクエストの時刻が Expires の時刻より遅いかどうかは署名の前に検証されます。
- 署名文字列をURLに挿入するときは、URLのUrlEncodeを必ず実行してください。
- 一時的なユーザーのURLに署名を追加する場合は、「security-token」を指定する必要があります。 形式は次のとおりです。
http://oss-example.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?AccessKeyId=AccessKeyId&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D&security-token=SecurityToken
サンプルコード
URL に署名を追加する Python コードの例:
import base64
import hmac
import sha
import urllib
h = hmac.new("OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV",
"GET\n\n\n1141889120\n/oss-example/oss-api.pdf",
sha)
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 ヘッダーを追加する必要はありません)。