CanvasアプリでFacebookから送られるユーザ情報について
1 signed_requestFacebookアプリ(Canvasアプリ)では、登録されたアプリをiframe内に表示する際、ユーザ情報を、signed_requestというパラメータに格納してアプリに送付します。
http://fb.dev-plus.jp/reference/coreconcepts/authentication/signed-request/
次の例は、パラメータを表示するだけのアプリですが、これをFacebookアプリ(Canvasアプリ)として登録し、「キャンパスページ」から呼び出すと、signed_requestが送られてきているのがわかります。
//---- HomeController.cs ----// public class HomeController : Controller{ public ActionResult Index(String signed_request){ ViewBag.signed_request = signed_request; return View(); } //---- Index.cshtml ----// @{ Layout = null; } <h1>Index</h1> signed_request = @ViewBag.signed_request
左は、アプリに直接アクセスしたのもで、右はキャンパスページからアクセスしたものです。
2 デコードsigned_requestは、HMAC SHA-256 signatureとピリオドと base64urlでエンコードされたJSONオブジェクトです。
下記のコードは、signed_requestからJSONオブジェクトを取り出しているものです。
if (signed_request != null){
string payload = signed_request.Split('.')[1];
var decodedJson = payload.Replace("=",string.Empty).Replace('-','+').Replace('_','/');
var base64JsonArray = Convert.FromBase64String(decodedJson.PadRight(decodedJson.Length + (4 - decodedJson.Length%4)%4,'='));
var json = (new UTF8Encoding()).GetString(base64JsonArray);
var data = JObject.Parse(json);
}
3 Facebook SDK利用によるデコード
Facebook SDK には、このsigned_requestをデコードするメソッドも提供されています。非常にスマートです。
if (signed_request != null){ var client = new FacebookClient(); client.AppSecret = "XXXXXXXX"; client.AppId = "XXXX"; dynamic data = client.ParseSignedRequest(signed_request); }
4 注意signed_requestに含まれるJSONデータに「user_id」が含まれるかどうかで、このアプリが承認されているかどうかなどを確認することができますが、signed_requestをパラメータで受け取れるのは、あくまでキャンパスページからアクセスされた場合だけです。アプリ内で相対パスで移動した場合などは、格納されません。
signed_requestには、アクセストークンなども含まれますが、これを積極的に使用するのであれば、アプリ内の全てのページ遷移も、https://apps.facebook.com/アプリ名/から始まるFQDNで指定する必要があります。