先日のエントリーで、PHP SDKの最新版で追加されたappsecret_proofというパラメータを紹介しました。その際、appsecret_proofの値について現段階ではバリデーション処理は行われていないらしいものの、appsecret_proofに絡む例外についてstackoverflow.comでトピックが上がっていたとも紹介しました。このトピックやappsecret_proofについて進展があったので紹介します。

アプリの設定画面

先日確認した段階では、アプリの設定画面上でappsecret_proofの設定を見つけられなかったのですが、今朝、見つけました。アプリの設定画面で Advanced > Security に行くと「Require AppSecret Proof for Server API calls」という項目があり、ここで有効/無効の設定ができます。

e7f93b0b3cb1c81b639bf4bfb03ef3f5

24日に新規作成したアプリでも「無効」になっていたので、今のところ、「新規でアプリを作成したら最初から有効になっていた!」などの混乱は起きなそうです。では、なぜこれに絡んだ問題がstackoverflow.comに投稿されていたのか、という問題に関しては後ほど説明します。話は逸れますが、新しく作ったアプリでのみ、数個上の項目に「Client Token」という項目が表示されていました。カーソルを重ねると「The Client Token is for auth methods in place of the app secret」と説明が出ます。

AppSecret Proofを有効にする

まずテストユーザを作成し、AppSecret Proofを無効にしたままでユーザの基本情報を取得してみます。
Oklahomers% curl -X GET \
> 'https://graph.facebook.com/me?access_token=XXXXXXXXXXXXXXX'
{"id":"100006006484235","name":"Linda Amfkfdhdbce Letuchysen","first_name":"Linda","middle_name":"Amfkfdhdbce","last_name":"Letuchysen","link":"http:\/\/www.facebook.com\/profile.php?id=100006006484235","gender":"female","timezone":0,"locale":"ja_JP","updated_time":"2013-05-27T13:39:27+0000"
}
appsecret_proofなしでも取得できました。PHP SDK内での挙動と同様にするため、POSTメソッド利用で?method=GETパラメータを付けて実行してみます。
Oklahomers% curl -X POST \
> -F 'access_token=XXXXXXXXXXXXXXX' \
> -F 'method=GET' \
> https://graph.facebook.com/me
{"id":"100006006484235","name":"Linda Amfkfdhdbce Letuchysen","first_name":"Linda","middle_name":"Amfkfdhdbce","last_name":"Letuchysen","link":"http:\/\/www.facebook.com\/profile.php?id=100006006484235","gender":"female","timezone":0,"locale":"ja_JP","updated_time":"2013-05-27T13:39:27+0000"}
この場合も取得できました。
いよいよ、設定画面でAppSecret Proof for Server API callsを有効にします。

09ca3a3567692b37c90e72ae56f91622

Oklahomers% curl -X GET \
> 'https://graph.facebook.com/me?access_token=XXXXXXXXXXXXXXX' {"error":{"message":"API calls from the server require an appsecret_proof argument","type":"GraphMethodException","code":100}}
Oklahomers% curl -X POST \
> -F 'access_token=XXXXXXXXXXXXXXX' \                         
> -F 'method=GET' \
> https://graph.facebook.com/me
{"error":{"message":"API calls from the server require an appsecret_proof argument","type":"GraphMethodException","code":100}}
いづれの場合も失敗しました。例のトピックで挙げられている例外と同じメッセージのようです
そこで、PHP SDKの中でやっているのと同等の操作でappsecret_proofの値を生成してみます。
Oklahomers% perl -MDigest::SHA -e 'print Digest::SHA::hmac_sha256_hex("XXXXXXXXXXXXXXX", "APP_SECRET_VAL")'
yyyyyyyyyyyyy86fb3f7fd3d8ceeb887544af6ff7f541d5f7b46xxxxxxxxxxxxxxx
これを用いて、再度ユーザの基本情報を取得してみます。
Oklahomers% curl -X POST \
> -F "access_token=XXXXXXXXXXXXXXX" \ > -F "appsecret_proof=yyyyyyyyyyyyy86fb3f7fd3d8ceeb887544af6ff7f541d5f7b46xxxxxxxxxxxxxxx" \ > -F "method=GET" \ > https://graph.facebook.com/me {"id":"100006006484235","name":"Linda Amfkfdhdbce Letuchysen","first_name":"Linda","middle_name":"Amfkfdhdbce","last_name":"Letuchysen","link":"http:\/\/www.facebook.com\/profile.php?id=100006006484235","gender":"female","timezone":0,"locale":"ja_JP","updated_time":"2013-05-27T13:39:27+0000"}
Oklahomers% curl -X GET \
> "https://graph.facebook.com/me?access_token=XXXXXXXXXXXXXXX&appsecret_proof=yyyyyyyyyyyyy86fb3f7fd3d8ceeb887544af6ff7f541d5f7b46xxxxxxxxxxxxxxx"
{"id":"100006006484235","name":"Linda Amfkfdhdbce Letuchysen","first_name":"Linda","middle_name":"Amfkfdhdbce","last_name":"Letuchysen","link":"http:\/\/www.facebook.com\/profile.php?id=100006006484235","gender":"female","timezone":0,"locale":"ja_JP","updated_time":"2013-05-27T13:39:27+0000"}
どちらの方法でも取得できることを確認できました。 先日stackoverflow.comで報告していた人は、何かの拍子で設定画面の該当項目を有効にしてしまったものの、PHP SDKがまだ最新ではなかった為にappsecret_proofパラメータが渡されていなかったようです。 その旨を返しておいたので、のちほど本人から回答が来てハッキリするかもしれません。
2013/06/30追記:06/26に質問者からコメントが着きました。やはり何かの拍子に設定画面をいじってしまったらしく、appsecret_proofの利用がONになっていたようです。設定をいじっていないのにいきなりappsecret_proofが求められるということは無いと分かったので一安心ですね。