3

BlobService.getBlobURL()ローカル マシンの Node.js の Azure ライブラリを使用して、Shared Access Signature を使用して BLOB への URL を生成しようとしています。しかし、生成された URL を介して BLOB を取得しようとすると、「署名が一致しませんでした」という認証エラーが発生します。Azure 管理ポータルから同じ BLOB をダウンロードすると、正常に機能します。

以下は、URL を生成するために使用しているコードです。

process.env['AZURE_STORAGE_ACCOUNT'] = "[MY_ACCOUNT_NAME]";
process.env['AZURE_STORAGE_ACCESS_KEY'] = "[MY_ACCESS_KEY]";

var azure = require('azure');
var blobs = azure.createBlobService();

blobs.getBlobUrl('[CONTAINER_NAME]', "[BLOB_NAME]",  { AccessPolicy: {
    Start: Date.now(),
    Expiry: azure.date.minutesFromNow(60),
    Permissions: azure.Constants.BlobConstants.SharedAccessPermissions.READ
}});

この関数によって生成される URL は次のとおりです。

https://[MY_ACCOUNT_NAME].blob.core.windows.net:443/[CONTAINER_NAME]/
    [ENCODED_BLOB_NAME]
    ?st=2013-10-28T18%3A34%3A23Z
    &se=2013-10-28T19%3A34%3A23Z
    &sp=r
    &sr=b
    &sv=2012-02-12
    &sig=rLB%2FEOAWzijkkWcseju8TJLAxzeE5e3Pvq1i68i5Erc%3D

この URL をブラウザーに貼り付けようとすると、次のエラー メッセージが表示されます。

<Error>
    <Code>AuthenticationFailed</Code>
    <Message>
        Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. RequestId:9fe3d3ed-97f4-43d1-8c65-c95ce6b15a08 Time:2013-10-28T18:34:43.3015398Z
    </Message>
    <AuthenticationErrorDetail>
    Signature did not match. String to sign used was r 2013-10-28T18:34:23Z 2013-10-28T19:34:23Z /[MY_ACCOUNT_NAME]/[CONTAINER_NAME]/[BLOB_NAME] 2012-02-12
    </AuthenticationErrorDetail>
</Error>

次に、Azure 管理ポータルにログオンし、同じ BLOB を選択してダウンロードしてみました。これはうまくいきました。管理ポータルから提供された URL は次のとおりです。

http://[MY_ACCOUNT_NAME].blob.core.windows.net/[CONTAINER_NAME]/
    [ENCODED_BLOB_NAME]
    ?sv=2012-02-12
    &st=2013-10-28T18%3A35%3A16Z
    &se=2013-10-28T18%3A42%3A16Z
    &sr=b
    &sp=r
    &sig=kcjV%2BkrNAaWOj%2F7NFwmHefXJEiEyu61U7mUTsw3pw7w%3D
4

1 に答える 1

2

Azure Node.js ライブラリ バージョン 0.7.16 の時点で、この動作を引き起こすバグがあるようです。Blob 名にスペースが含まれBlobService.getBlobURL()ている場合、正しい署名の生成に失敗します。解決するには、名前にスペースを含まない新しい BLOB をアップロードし、新しい BLOBBlobService.getBlobURL()の名前で再度呼び出します。今回作成したURLが有効になります。この問題については、Githubで確認できます。

于 2013-10-29T13:25:33.847 に答える