Читать OAuth2.0 Signed_Request Facebook Регистрация C # MVC - PullRequest
5 голосов
/ 02 января 2011

Мой вопрос очень похож это но я думаю, мне нужно сделать еще один шаг вперед.

Facebook сообщает: «Данные передаются в ваше приложение в виде подписанного запроса. Параметр signature_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);
    }

Ответы [ 3 ]

8 голосов
/ 02 января 2011

Вот код, который мы использовали в 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

1 голос
/ 29 ноября 2011

Вот как это сделать, используя Facebook SDK

var parsedSignedRequest = FacebookSignedRequest.Parse(FacebookApplication.Current, signed_request);
1 голос
/ 24 января 2011

Судя по вашему комментарию, похоже, что вы все еще ищете ответ, который отправляет FB. Я полагаю, что это содержится в коллекции Form в объекте запроса HttpContext. Таким образом, со страницы, которую вы указываете в качестве перенаправления, вы сможете извлечь ее из:

HttpContext.Current.Request.Form ( "signed_request")

Надеюсь, это поможет пролить свет. Я все еще учусь на ходу, так что это может быть не лучшим решением.

спасибо, Jason

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...