Service Bus 通知ハブを利用してプッシュ通知を送信したいのですが、
Webアプリケーションの機能に追加するためPHPで実装しています。
http://msdn.microsoft.com/en-us/library/windowsazure/dn223264.aspx
単純なHTTPクライアントから上記の REST API をコールしたいのですが、
リクエストヘッダによる認証に失敗して401が出ます。
Shared Access Signature Authentication with Service Bus
http://msdn.microsoft.com/en-us/library/windowsazure/dn170477.aspx
認証トークンは上記の記事を参考に以下のコードで生成しています。
値は仮のものに変えてありますが、
Service Bus の Namespace Name : ns-foo
ns-foo の Notification Hub の Name: nh-bar
とすると、
$uri = "https://ns-foo.servicebus.windows.net/nh-bar/messages/?api-version=2013-08"; $client->setUri($uri); $client->setHeaders("content-type", "application/json;charset=utf-8"); $client->setHeaders("ServiceBusNotification-Format", "gcm"); $keyName = "DefaultSendSharedAccessSignature"; $expiry = strval(time() + 10000); $resourceUri = "http://ns-foo.servicebus.windows.net/nh-bar"; $stringToSign = $resourceUri . "\n" . $expiry; $primaryKey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; $signature = hash_hmac('sha256', $stringToSign, $primaryKey, false); $token = sprintf("SharedAccessSignature sig=%s&se=%s&skn=%s&sr=%s", $signature, $expiry, $keyName, urlencode($resourceUri)); $client->setHeaders("Authorization", $token); $json = '{ "collapse_key": "score_update" }'; $client->setRawData($json, 'text/plain'); $client->setMethod(Zend_Http_Client::POST); $response = $client->request();
レスポンスのメッセージは、
40103: Invalid authorization token signature
です。
MalformedToken など各種エラーを経て修正した結果がこれなので、
ヘッダの書式そのものは正しいはずです。
メッセージによるとシグネチャが不正とのことなので、
リソースURIか、ハッシュ化の手順のどこかが間違っているのでしょうか。
KEY NAME, PRIMARY KEY については認証規則の値を確認済みです。
おかしい部分がありましたらご指摘下さい。
よろしくお願いします。