Signature Calculation

最終更新日:2023-02-06 15:35:17

リクエストごとに、クラウドVoDはリクエストの認証ヘッダーを介してIDを検証します。

このセクションでは、クラウドVoDからビデオリストを取得する例を取り、認証ヘッダーを作成する方法をステップごとに示します。
映像一覧取得URL:
https://api.cloudv.haplat.net/vod/videoManage/getVideoList

使用方法

認証は、アルゴリズム、AccessKey Secret、SignedHeaders、および署名で構成されます。 WS3-HMAC-SHA256ではアルゴリズムは固定値のため、認可は以下のようになります。

Authorization:WS3-HMAC-SHA256
Credential=<AccessKeyId >/<Date>/<Region>/<Service>/wos_request,
SignedHeaders=<SignedHeader>;<SignedHeader>;<SignedHeader>,
Signature=<Signature>

全体的な計算プロセスは次のようになります。

  1. Signature= HexEncode(HMAC_SHA256(SecretKey, StringToSign ));
  2. Stringtosign =Algorithm+ ‘\n’ +Timestamp+ ‘\n’ + Hash.SHA256( CanonicalRequest )
  3. CanonicalRequest = Method + ‘\n’ + RequestURI + ‘\n’ + QueryString + ‘\n’ + CanonicalHeaders + ‘\n’ + SignedHeaders + ‘\n’ + HashedRequestPayload
  4. HashedRequestPayload = Lowercase(HexEncode(Hash.SHA256( RequestPayload )))

推奨される計算ステップ

1.正規リクエストを作成する

リクエストのコンテンツ (ホスト、アクション、ヘッダーなど) を標準 (正規) 形式に配置します。正規リクエストは、署名する文字列を作成するために使用される入力の 1 つです。

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

正規リクエストと、アルゴリズム、リクエスト日、資格情報の範囲、正規リクエストのダイジェスト(ハッシュ)などの追加情報で署名する文字列を作成します。

3. 署名を計算する

このステップでは、まず、リクエスト日、リージョン、サービスにおいて、あなたの秘密アクセス鍵を初期ハッシュオペレーションの鍵として使用し、鍵付きハッシュオペレーション(HMACオペレーション)を連続して行うことで、署名鍵を導出する必要があります。 br>
署名鍵を導出したら、署名する文字列で鍵付きハッシュ操作を実行することで、署名を計算します。派生した署名鍵をこの操作のハッシュ鍵として使用します。

タスク 1: 正規リクエストを作成する

署名プロセスを開始するには、リクエストからの情報を標準化された(標準的な)形式で含む文字列を作成する必要があります。これにより、クラウドVoDがリクエストを受信したときに、あなたが計算したのと同じ署名をサービス側で計算できるようになります。

次の形式で正規リクエストを作成する必要があります。

<HTTPMethod> + "\n" +
<RequestURI> + "\n" +
<QueryString> + "\n" +
<CanonicalHeaders> + "\n" +
<SignedHeaders> + "\n" +
<HashedPayload>

正規リクエストの場合:

フィールド 説明
HTTPMethod GETやPOSTなど、HTTPメソッドの1つ。リクエスト例では、POSTメソッドを使用しています。
RequestURI リクエストの URI。動画リストAPIを取得するためのURIは、/vod/videoManage/getVideoListです。
QueryString リクエストURLのクエリ文字列パラメータ。 POSTリクエストの場合、QueryStringは空文字列「」です。
GETリクエストの場合、QueryStringは「?」に続く文字列です。リクエストURLに .例えば、videoName=testVideoName&pageIndex=2&pageSize=5 です。 *
CanonicalHeaders 署名の計算に使用されるヘッダーのキーと値。 CanonicalHeadersには、少なくともHeaders hostcontent-typeを含める必要があります。より良い認証のために、カスタマイズされたヘッダーを CanonicalHeaders に追加することもできます。
注意:
1.すべての大文字を小文字に変換し、最初と最後のスペースを削除する必要があります。その後、key:value\nの形式でキーと値を組み立てます。
2. CanonicalHeadersに含めるヘッダが複数ある場合、ヘッダのすべてのキーと値は、ヘッダキー(小文字)のASCIIの新しい順序でソートされる必要があります。
SignedHeaders リクエスト ヘッダー名の小文字をセミコロンで区切った ASCII の昇順にソートされたリスト。リストされたヘッダーは、 CanonicalHeaders にリストされたものと同じである必要があります。

例えば、上記の CanonicalHeaders の例では、SignedHeaders は次のようにする必要があります。
content-type;host
HashedRequestPayload リクエストペイロードのSHA256ハッシュの16進数の値。
例えば、リクエストがcontent-typeの場合:application/jsonの場合、HashedRequstPayloadは次のようになります。
Lowercase(HexEncode(Hash.SHA256({"videoName":"a","pageSize":"5","pageIndex":"2"})))リクエストがcontent-type:application/x-www-form-urlencodedの場合、HashedRequestPayloadは:< Lowercase(HexEncode(Hash.SHA256("videoName=a&pageIndex=2&pageSize=5")))注: **Lowercase(HexEncode(Hash.SHA256(RequestPayload)))**は、リクエストペイロードのHASHを計算し、16進数にエンコードして小文字に変換するための疑似コードです。
GETリクエストの場合、 135b13e1b15e3c836eab2ab9196a86e7bcdb7b68da27215175a65b89ade3587eは空文字列のハッシュで、ハッシュは以下の値を返します。

この例の場合、CanonicalRequest は次のようになります。

POST
/vod/videoManage/getVideoList
content-type:application/json; charset=utf-8
host:api.cloudv.haplat.net
content-type;host
641f7989f8d223af8c5049f805890fcaf2ae4a99780a01eb454cf7c9368dd1a4

タスク 2: 署名する文字列を作成する

署名する文字列には、リクエストと、タスク 1: 署名の正規リクエストを作成するで作成した正規リクエストに関するメタ情報が含まれます。署名する文字列と後から作成する派生署名鍵を入力として使用し、**タスク3:**署名を計算するでリクエスト署名を計算します。

署名する文字列は、次の文字列を連結したものです。

StringToSign =
    Algorithm + \n +
    Timestamp + \n +
    HashedCanonicalRequest
フィールド 説明
Algorithm お使いのハッシュアルゴリズムで、現在「WS3-HMAC-SHA256」に固定です。
Timestamp リクエストヘッダーで使用する値と一致する秒単位のタイムスタンプ。この例では、値は 1564645579 です。
HashedCanonicalRequest タスク 1: 正規リクエストを作成する で作成したCanonicalRequest のハッシュ。この例では、 16bc1b4d4e6818f5aec2a7273cb2c3d3e4831fd61c6510222b9bec19bffac646 .

注: タイムスタンプと標準時を同期させる必要があります。そうしないと、時差が5分以上あると同期に失敗します。システムが長い間標準時と同期していない場合、リクエストに失敗し、タイムスタンプの有効期限が原因で期限切れ署名エラーを返す可能性があります。

この例では、StringToSign は次のようになります。

WS3-HMAC-SHA256
1564645579
16bc1b4d4e6818f5aec2a7273cb2c3d3e4831fd61c6510222b9bec19bffac646

タスク 3: 署名を計算する

署名は、タスク2で作成した署名する文字列のHMAC-SHA256ハッシュで、accessKey Secretをハッシュエンコードの鍵として使用します。計算方法は以下の通りです。

Signature = HMAC-SHA256(SigningKey, StringToSign)

注: 使用しているプログラミング言語に対して、HMACパラメータを正しい順序で指定するようにしてください。この例では、第1パラメータとしてキーを、第2パラメータとしてデータ(メッセージ)を示していますが、使用する機能によって、キーとデータを指定する順序が異なる場合があります。*

タスク 4: 承認を作成する

Authorizationは、認証のためにリクエストヘッダーに配置する必要がある値です。結果の認証は、以下のように行うことができます。

Authorization =
    Algorithm + ' ' +
    'Credential=' + AccessKey + ', ' +
    'SignedHeaders=' + SignedHeaders + ', ' +
    'Signature=' + Signature
フィールド 説明
Algorithm お使いのハッシュアルゴリズムで、現在「WS3-HMAC-SHA256」に固定です。
AccessKey アクセスキー ID。 AccessKey IDは、コンソールのセキュリティ設定>アクセス制御>ユーザー情報管理>アクセスキー管理で取得できます。この例の AccessKey ID はAKIDz8krbsJ5yKBZQpn74WFkmLPx3例.
SignedHeaders 詳細は、タスク 1: 正規リクエストを作成するを参照してください。この例では、値はコンテンツタイプ;ホスト.
Signature タスク 3: 署名を計算するで作成した署名。この例では、署名値は72e494ea809ad7a8c8f7a4507b9bddcbaa8e581f516e8da2f66e2c5a96525168 .

上記の情報によると、次のように認証を取得できます。

WS3-HMAC-SHA256 Credential=AKIDz8krbsJ5yKBZQpn74WFkmLPx3EXAMPLE, SignedHeaders=content-type;host, Signature=792dcb6d648a456a030c9c6683fa7bde2a31cb4c72cfeaa354da000adf7c288d

そして、最終的なリクエストは次のとおりです。

POST https://api.cloudv.haplat.net/
Authorization: WS3-HMAC-SHA256 Credential=AKIDz8krbsJ5yKBZQpn74WFkmLPx3EXAMPLE, SignedHeaders=content-type;host, Signature=792dcb6d648a456a030c9c6683fa7bde2a31cb4c72cfeaa354da000adf7c288d
Content-Type: application/json; charset=utf-8
Host: api.cloudv.haplat.net
X-WS-AccessKey: AKIDz8krbsJ5yKBZQpn74WFkmLPx3EXAMPLE
X-WS-Timestamp: 1564645579

{"videoName":"a","pageSize":"5","pageIndex":"2"}

エラーコード

コード 説明
4001 認証パラメータが無効です。リクエストですべての必要なパラメータが送信されたかどうかを確認してください。
4002 X-WS-AccessKey エラー。リクエストにアクセスキーが存在するかどうかを確認してください。
4003 X-WS-Timestampが無効です。タイムスタンプは第2レベルである必要があります。
4004 X-WS-Timestamp が期限切れです。
4005 無効なホスト パラメータです。
4006 コンテンツ タイプが正しくありません。
4007 認証に失敗しました。パラメータが正しいかどうかを確認してください。
4008 認証に失敗しました。この失敗は、以下の理由で発生する可能性があります。
- 不正確な署名。
- 署名が、リクエストで実際に送信されたものと一致しません。
- 不正なアクセスキー シークレット。
4009 この認証はすでに別のリクエストで使用されています。別のリクエストを作成してください。

カール 例

POSTリクエスト

content-type:application/json

curl -X POST https://api.cloudv.haplat.net/vod/videoManage/getVideoList 
-H "Authorization: WS3-HMAC-SHA256 Credential=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, SignedHeaders=content-type;host, Signature=471d8f86cefa4fa2f929642207b6df8fe770e82e0df328f4f68af08c8b8a8029" 
-H "Content-Type: application/json; charset=utf-8" 
-H "Host: api.cloudv.haplat.net" 
-H "X-WS-Timestamp: 1564644606" 
-H "X-WS-AccessKey: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 
-d '{"videoName": "a","pageIndex":"2","pageSize":"5"}'

content-type:application/x-www-form-urlencoded

curl -X POST https://api.cloudv.haplat.net/vod/videoManage/getVideoList 
-H "Authorization: WS3-HMAC-SHA256 Credential=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, SignedHeaders=content-type;host, Signature=37ea1014de0c90e83e733f8d19a5d3ae993896d34450c9f8cf8df5642c81339e" 
-H "Content-Type: application/x-www-form-urlencoded; charset=utf-8" 
-H "Host: api.cloudv.haplat.net" 
-H "X-WS-Timestamp: 1564644607" 
-H "X-WS-AccessKey: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 
-d 'videoName=a&pageIndex=2&pageSize=5'

GETリクエスト

curl -X GET https://api.cloudv.haplat.net/vod/videoManage/getVideoList?videoName=a&pageIndex=2&pageSize=5 
-H "Authorization: WS3-HMAC-SHA256 Credential=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, SignedHeaders=content-type;host,     Signature=0b489e43c5cd2e52cbe0768a68c614a4211210a6d63b18ff65cc986f18e75aac" 
-H "Content-Type: application/x-www-form-urlencoded; charset=utf-8" 
-H "Host: api.cloudv.haplat.net" 
-H "X-WS-Timestamp: 1564644607" 
-H "X-WS-AccessKey: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

GET リクエストの場合、Content-Type は application/x-www-form-urlencoded である必要があります。