こんにちは、オークファンの @dz_ こと大平かづみです。
Prologue - はじめに
Azure DocumentDB は、ドキュメントの他に「ユーザー」も扱うことができます。
そこで PHP から REST API を使って利用したところ、 ユーザーの取得時に「MAC 署名が一致しない」というエラーが発生し、しばらく悩みました。
解決方法がわかったので、ご紹介します。
エラー内容
今回、MAC署名が一致しないエラーが発生したのは、以下の users
の 取得 するURIでした。
エラーを確認した URI
エラーの内容
{
"code": "Unauthorized",
"message": "Message: {\"Errors\":[\"The MAC signature found in the HTTP request is not the same as the computed signature. Server used following string to sign - 'get\\nusers\\xxxxxxx==\\nwed, 22 jun 2016 05:00:38 gmt\\n\\n'\"]}\r\nActivityId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, Request URI: /apps/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/services/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/partitions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/replicas/xxxxxxxxxxxxxxxxxxx"
}
ちなみに、取得は失敗するが、書込みは成功します。また、他の dbs
colls
docs
の取得や書込みは、問題ありません。
原因
今回のエラーの原因は、使うキーの選択が誤っていました。
どういうことかといいますと、DocumentDB には、下図のようにマスターキーの他に、 読み取り専用キー があります。
私は読み取りの時にはこの 読み取り専用キー を利用しています。
が、しかし!
ユーザーの取得については、読み取り専用キーではなく マスターキー を用いなければならないことがわかりました。
なお、キーの詳細に関しては、 DocumentDB のデータへのアクセスをセキュリティで保護する方法 をご参照ください。
対処
ということで、ユーザーの取得(一覧、単体)では、 マスターキー を使いましょう。
Epilogue - おわりに
調べていると、リソーストークンというものも便利そうです。適材適所で利用できるよう工夫してみます。