阅读OAuth2.0 Signed_Request Facebook注册C#MVC

Jos*_*osh 5 facebook oauth asp.net-mvc-2

我的问题是非常相似的这个,但我想我需要把它一步.

Facebook表示"数据作为已签名的请求传递给您的应用程序.igned_request参数是一种简单的方法,可确保您收到的数据是Facebook发送的实际数据."

用户登录我的asp c#MVC站点并单击"注册"后,redirect-url为http:// site/account/register.此时(帐户/注册控件的帖子),我想使用签名请求收集用户的信息,以便我可以在本地注册我的网站.我无法弄清楚如何访问facebook提供的数据.

$data = json_decode(base64_url_decode($payload), true);
Run Code Online (Sandbox Code Playgroud)

C#中的等价物是什么?Facebook在帖子中传递了什么类型的变量/数据?我如何访问"$ payload"?

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

        return View(model);
    }
Run Code Online (Sandbox Code Playgroud)

Nat*_*ten 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;
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里找到完整的源代码:http://facebooksdk.codeplex.com/SourceControl/changeset/view/f8109846cba5#Source%2fFacebook%2fFacebookApp.cs

  • 我有Facebook C#SDK的v5.0.8.0 - 而且没有'FacebookSignedRequest`类.它被删除了吗? (2认同)