Неверный подписанный запрос

У меня есть сайт, который использует Facebook API для входа. Мы используем JS SDK и C# SDK.

Наш сайт работал нормально около месяца, но прошлой ночью люди начали получать пустые страницы при входе в систему.

Это также произошло один раз во время бета-тестирования, но мы решили, что это произошло из-за некоторых изменений, которые мы внесли в процесс входа в Facebook, и они исчезли после того, как мы удалили наши файлы cookie. Но теперь это произошло снова, и я не могу попросить своих пользователей удалить их файлы cookie (для некоторых это, кажется, помогает, просто перезапустив браузер, хотя это все еще очень раздражает)

В моем журнале ошибок я вижу ошибку, которая выглядит следующим образом:

System.InvalidOperationException: Invalid signed request.
    at Facebook.FacebookSignedRequest.TryParse(String secret, String signedRequestValue, Int32 maxAge, Double currentTime, Boolean throws)
    at Facebook.FacebookSignedRequest.Parse(String secret, String signedRequestValue)
    at Facebook.FacebookSignedRequest.GetSignedRequest(String appId, String appSecret, HttpContextBase httpContext)
    at Facebook.FacebookSession.GetSession(String appId, String appSecret, HttpContextBase httpContext, FacebookSignedRequest signedRequest)
    at Facebook.Web.FacebookWebContext.get_Session()
    at Facebook.Web.FacebookWebContext.IsAuthenticated()
    at Facebook.Web.FacebookWebContext.IsAuthorized(String[] permissions)
    at Facebook.Web.Mvc.FacebookAuthorizeAttribute.OnAuthorization(AuthorizationContext filterContext, IFacebookApplication facebookApplication)
    at System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor)
    at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
    at System.Web.Mvc.Controller.ExecuteCore()
    at System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)
    at System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<>c__DisplayClassb.<BeginProcessRequest>b__5()
    at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0()
    at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

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

Очевидно, похоже, что это как-то связано с файлом cookie или потерей сеанса. Кажется, это случается с людьми, которые не выходят из Facebook, которые остаются в системе, а затем возвращаются позже и, возможно, теряют сеанс, и когда они снова входят в систему, это не работает. Я не могу подтвердить это на 100%, но также кажется, что ошибка возникает у многих людей, которые оставляют настоящий сайт открытым в своем браузере и просто позволяют своему компьютеру перейти в спящий режим, а затем на следующий день, когда они начинают навигацию по сайту снова они получают пустую страницу, поэтому они переходят на страницу входа, пытаются войти, но после входа снова получают пустую страницу.

Таким образом, вы могли бы сказать, что именно это вызывает ошибку, но почему это происходит со всеми в один и тот же день, а не с кем-то время от времени? Это не имеет смысла для меня.

JS регистрации выглядит так:

<script>
window.fbAsyncInit = function () {
    FB.init({
        appId: 'XXXXXXXXXXXX',
        channelUrl: 'http://www.xxxxxx.com/channel.html',
        status: true, // check login status
        cookie: true, // enable cookies to allow the server to access the session
        oauth: true, // enable OAuth 2.0
        xfbml: true  // parse XFBML
    });

    // Run js that is dependent on the Facebook session
    initFacebook(); 

    FB.Canvas.setAutoResize();

};

// Load the SDK Asynchronously
(function (d) {
    var js, id = 'facebook-jssdk'; if (d.getElementById(id)) { return; }
    js = d.createElement('script'); js.id = id; js.async = true;
    js.src = "//connect.facebook.net/en_US/all.js";
    d.getElementsByTagName('head')[0].appendChild(js);
} (document));
</script>

Любая помощь будет принята с благодарностью!


person Magnus Jönsson    schedule 05.01.2012    source источник
comment
Используете ли вы официальный C# SDK (который устарел) или SDK C# с открытым исходным кодом, размещенный на codeplex?   -  person Juicy Scripter    schedule 05.01.2012
comment
Я использую тот, который размещен на Codeplex (через NuGet)   -  person Magnus Jönsson    schedule 05.01.2012


Ответы (2)


Проблема, похоже, связана с избыточными файлами cookie от Facebook. Я разместил вопрос здесь, stackoverflow и отчет о проблеме на веб-сайте Codeplex C# SDK Facebook, где я объясняю причину проблемы и показать точное место в коде SDK, где возникает исключение. Надеюсь привлечь некоторое внимание, потому что проблема довольно серьезная и, вероятно, связана с реализацией FB OAuth 2.0.

person lencinhaus    schedule 12.01.2012

Мы прекращаем поддержку анализа файлов cookie в Facebook C# SDK. Facebook больше не рекомендует разработчикам или SDK напрямую читать файлы cookie. Мы предоставим дополнительную документацию и рекомендации по этому вопросу в документации Facebook C# SDK (http://docs.cshapsdk.org) в ближайшем будущем.

См. подробности о рекомендации Facebook не использовать файлы cookie здесь: https://developers.facebook.com/blog/post/624/

person Nathan Totten    schedule 08.02.2012