2012-01-05 2 views
2

У меня есть сайт, который использует 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> 

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

+0

Вы используете официальный C# SDK (который [устаревшее] (http://developers.facebook.com/blog/post/624/)) или [SDK с открытым исходным кодом C#, размещенном на codeplex] (http://facebooksdk.codeplex.com/)? –

+0

Я использую тот, который размещен на Codeplex (через NuGet) –

ответ

0

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

0

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

Подробнее о рекомендации Facebook, не использовать куки здесь: https://developers.facebook.com/blog/post/624/