2011-01-01 18 views
5

私の質問は非常に似ていますthisしかし、私はそれをさらに一歩踏み出す必要があると思います。OAuth2.0を読むSigned_Request Facebook登録C#MVC

「署名されたリクエストとしてアプリケーションにデータが渡されます。signed_requestパラメータは、受信したデータがFacebookによって送信された実際のデータであることを確認する簡単な方法です。

ユーザが自分のasp c#MVCサイトにログインして「登録」をクリックすると、リダイレクトURLはhttp://site/account/registerになります。その時点(アカウント/登録管理者への投稿)では、署名されたリクエストを使用してユーザーの情報を収集し、自分のサイトにローカルで登録できるようにしたいと考えています。私は利用可能なデータのFacebookにアクセスする方法を把握することはできません。

$data = json_decode(base64_url_decode($payload), true); 

C#での対応はなんですか?どのようなタイプの変数/データは、ポストに渡すFacebookのですか?そして、 "$ payload"にどうやってアクセスしますか?

[HttpPost] 
    public ActionResult RegisterFacebook(RegisterFacebookModel model) 
    { 
     Facebook.FacebookSignedRequest sr = Facebook.FacebookSignedRequest.Parse("secret", model.signed_request); 

     return View(model); 
    } 

答えて

8

ここではFacebook C#SDKで使用したコードを示します。あなたが私たちのSDKを使用する場合は、手動でこれを行う必要はありませんが、あなたはここでそれを自分で行う必要がある場合には、次のとおりです。

/// <summary> 
/// Parses the signed request string. 
/// </summary> 
/// <param name="signedRequestValue">The encoded signed request value.</param> 
/// <returns>The valid signed request.</returns> 
internal protected FacebookSignedRequest ParseSignedRequest(string signedRequestValue) 
{ 
    Contract.Requires(!String.IsNullOrEmpty(signedRequestValue)); 
    Contract.Requires(signedRequestValue.Contains("."), Properties.Resources.InvalidSignedRequest); 

    string[] parts = signedRequestValue.Split('.'); 
    var encodedValue = parts[0]; 
    if (String.IsNullOrEmpty(encodedValue)) 
    { 
     throw new InvalidOperationException(Properties.Resources.InvalidSignedRequest); 
    } 

    var sig = Base64UrlDecode(encodedValue); 
    var payload = parts[1]; 

    using (var cryto = new System.Security.Cryptography.HMACSHA256(Encoding.UTF8.GetBytes(this.AppSecret))) 
    { 
     var hash = Convert.ToBase64String(cryto.ComputeHash(Encoding.UTF8.GetBytes(payload))); 
     var hashDecoded = Base64UrlDecode(hash); 
     if (hashDecoded != sig) 
     { 
      return null; 
     } 
    } 

    var payloadJson = Encoding.UTF8.GetString(Convert.FromBase64String(Base64UrlDecode(payload))); 
    var data = (IDictionary<string, object>)JsonSerializer.DeserializeObject(payloadJson); 
    var signedRequest = new FacebookSignedRequest(); 
    foreach (var keyValue in data) 
    { 
     signedRequest.Dictionary.Add(keyValue.Key, keyValue.Value.ToString()); 
    } 

    return signedRequest; 
} 

/// <summary> 
/// Converts the base 64 url encoded string to standard base 64 encoding. 
/// </summary> 
/// <param name="encodedValue">The encoded value.</param> 
/// <returns>The base 64 string.</returns> 
private static string Base64UrlDecode(string encodedValue) 
{ 
    Contract.Requires(!String.IsNullOrEmpty(encodedValue)); 

    encodedValue = encodedValue.Replace('+', '-').Replace('/', '_').Trim(); 
    int pad = encodedValue.Length % 4; 
    if (pad > 0) 
    { 
     pad = 4 - pad; 
    } 

    encodedValue = encodedValue.PadRight(encodedValue.Length + pad, '='); 
    return encodedValue; 
} 

あなたがここに完全なソースコードを見つけることができますに基づいてhttp://facebooksdk.codeplex.com/SourceControl/changeset/view/f8109846cba5#Source%2fFacebook%2fFacebookApp.cs

+0

を使用してそれを行う方法ですあなたの応答、ネイサンいただきありがとうございます。私は時間が足りず、もう一度テストする機会がありませんでしたが、あなたが示したことは理にかなっています。私はSDKについても見ていきます。 – Josh

+0

私はまだこの(またはSDK)を使用して実装する方法を理解していないと思います。 signed_requestは、fb:登録コードのredirect-uriへの投稿として送信されますか?私はログイン/登録のためにjs SDKを使用していますが、会員資材が処理されるとより深い統合のために参照したFacebookAPIを使用しようとしています。私はこの点を過ぎることができればいいと思っています...私はちょうどハングアップしています。私はMVCプロジェクトを構築しており、httpポストハンドラで登録コールバックを指し示していますが、fbが送信するはずのjsonオブジェクトをデコードする必要があります。しかし、私は何も戻っていない。 – Josh

+0

Nathan - SDKを使用しているので、すぐにフォローアップをお願いできます。「登録」パラメータを除いて、signed_requestのすべてのパラメータが表示されます。 (つまり: "登録":{ "name": "Paul Tarjan" ...私は何か間違っているのですか?Facebookのテストページに投稿すると、SDKデコードを行った後では表示されません。 "電子メール": "[email protected]"、 "場所":{ "名": "サンフランシスコ、カリフォルニア州"、 "ID":114952118516947 }、私はv5.0.8を持っている – Josh

1

あなたのコメントは、FBが送信している応答を探しているようです。私はそれがHttpContext RequestオブジェクトのFormコレクションに含まれていると信じています。ですから、リダイレクトとして指定したページから、あなたがからそれを引くことができる必要があります:

HttpContext.Current.Request.Form(「signed_request」)いくつかの光を当てることができます

希望を。私はまだ最善の解決策ではないかもしれないので、私はまだ学んでいます。ここで

おかげで、 ジェイソン

+0

ありがとう、ジェイソン。私はMVCプロジェクトで作業しているので、HttpContextはコントローラ環境では利用できませんが、2つの答えをどのように組み合わせて、主に動作させるかを考え出しました。 Facebook-SDKを使用すると、返された "signed_request"を簡単に処理できました。 – Josh

1

Facebook SDK

var parsedSignedRequest = FacebookSignedRequest.Parse(FacebookApplication.Current, signed_request); 
+4

Facebook SDK v6を使用している場合、これは時代遅れです。今は 'var fb = new FacebookClient()です。 動的signedRequest = fb.ParseSignedRequest( "app_secret"、Request.Params ["signed_request"]); ' –

関連する問題