web-dev-qa-db-ja.com

REST経由でAzureサービスバスキューにメッセージを送信します

AzureキューはREST APIに公開されています。REST呼び出しを機能させるには、POSTMANでサンプルテストを実行しました。POST呼び出し

https://yournamespace.servicebus.windows.net/yourentity/messages

また、2つのヘッダーと値の下を渡します。

ヘッダー1:

Authorization: SharedAccessSignature sr=https%3A%2F%2F.servicebus.windows.net%2Fyourentity&sig=yoursignature from code above&se=1529928563&skn=KeyName

例:

SharedAccessSignature sr=https%3A%2F%2Fservicebussoatest1.servicebus.windows.net%2Fpublishque&sig=a0wmRklbCGFCYoSCViij9gagtZV9Bg+vU=&se=1529928563&skn=testpolicy

ヘッダー2:

Content-Type: application/json

しかし、正しいAuthorization値を渡しても、以下のエラーが発生します。

401:無効な認証トークンの署名

8
user3796942

401:無効な認証トークンの署名

401エラーによると、トークンは有効ではありません。

まず、ポリシーにメッセージを送信するためのアクセス権があることを確認してください。

次に、 Azure service bus Send Message Rest APi を使用する場合。形式は次のとおりです。

POST https://<yournamespace>.servicebus.windows.net/<yourentity>/messages
Authorization: SharedAccessSignature sr=https%3A%2F%2F<yournamespace>.servicebus.windows.net%2F<yourentity>&sig=<yoursignature from code above>&se=1438205742&skn=KeyName
ContentType: application/atom+xml;type=entry;charset=utf-8

この記事 から、共有アクセスシグネチャを使用したService Busアクセスコントロールに関する詳細情報を取得することもできます。

私は郵便配達員と一緒にデモもします。それは私の側で正しく動作します。

次のコードを使用してSASトークンを取得します。

public static string GetSasToken(string resourceUri, string keyName, string key, TimeSpan ttl)
{
      var expiry = GetExpiry(ttl);
      string stringToSign = HttpUtility.UrlEncode(resourceUri) + "\n" + expiry;
      HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(key));
      var signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)));
      var sasToken = String.Format(CultureInfo.InvariantCulture, "SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}",
      HttpUtility.UrlEncode(resourceUri), HttpUtility.UrlEncode(signature), expiry, keyName);
      return sasToken;
}

private static string GetExpiry(TimeSpan ttl)
{
    TimeSpan expirySinceEpoch = DateTime.UtcNow - new DateTime(1970, 1, 1) + ttl;
    return Convert.ToString((int)expirySinceEpoch.TotalSeconds);
}
string queueUrl = "https://tomtestsb.servicebus.windows.net/" + "queue" + "/messages";
string token = GetSasToken(queueUrl,"Key", "value", TimeSpan.FromDays(1));

Azureポータルでキーと値を取得できました

enter image description here

Postmanでテストします。

ヘッダー:

Authorization:SharedAccessSignature sr=https%3a%2f%2fyournamespace.servicebus.windows.net%2fqueuename%2fmessages&sig=SyumAUNnqWFjW2MqjwlomU%2fbblqZljq6LPJp3jpfU%2b4%3d&se=1529478623&skn=KeyName

Content-Type:application/xml

ボディ

<string xmlns="http://schemas.Microsoft.com/2003/10/Serialization/">This is a message.</string> 

テスト結果:

enter image description here

13
Tom Sun - MSFT