Многочисленные исключения OAuth C # + Cookies + Non-Canvas - PullRequest
0 голосов
/ 22 декабря 2010

Хорошо, так что это немного похоже на вопрос кого-то еще без ответа на сайте Codeplex, но, возможно, здесь будет больше удачи. Первое очень многократно повторяется даже на образце сайта (CSMvcWebsite):

[FacebookOAuthException: (OAuthException) Ошибка при проверке токена доступа.]

FacebookApp.Session НЕ является нулевым, но вызов FacebookApp.Get () выбрасывает этот Booger.

Происходит, когда вы находитесь на странице, которая называется FB JS api's (таким образом, создается файл cookie FB-сессии), а затем вы выходите из Facebook. Если вы затем перезагрузите эту страницу, появится ошибка выше. Легко воспроизвести. Откройте образец сайта и Facebook в отдельных вкладках. Нажмите About в образце. Выйти из Facebook. Обновите страницу о программе (или нажмите еще раз).

В примере сайта вы можете довольно легко избавиться от этого, перейдя на страницу, которая не вызывает API-интерфейсы FB. Однако, если у вас есть главная страница, которая является страницей входа в систему (то есть вы не можете делать приседания, пока не вошли в систему), и страница входа в систему вызывает FB API, тогда пуф! Проблема. Нет другой страницы для навигации. Единственное исправление - создание фиктивной страницы и переход к ней (или удаление cookie вручную).

Две проблемы здесь. Во-первых, как определить, что вы вышли из системы? Возможно поймать вышеупомянутое исключение? Это единственная причина, по которой ты это получил? Во-вторых, как заставить куки уйти (предположительно, с помощью JS) ???

Второе исключение встречалось только пару раз, но, опять же, это то, что я видел без ответа на сайте codeplex:

[! SessionValue.Contains (",") Значение сеанса не должно содержать запятую.]

WTH ?? Непросто воспроизвести (на самом деле я вообще не могу сделать это по требованию), но я видел это на неизмененной версии того же образца, что и выше. Но этот был еще более коварным, так как единственное решение состояло в том, чтобы вручную удалить куки (интересно, и, возможно, что особенно важно, в этом случае было два куки fbs_).

Есть мысли или советы ??

1 Ответ

1 голос
/ 27 декабря 2010

Проблема в том, что у вашего серверного кода нет способа сообщить, является ли сеанс пользователя действительным или нет, пока вы не отправите запрос в Facebook.Учтите, что файл cookie со сведениями о старом пользователе все еще находится на клиенте, и этот файл cookie отправляется на сервер.Файл cookie действителен в том смысле, что он содержит достоверную информацию.Помимо проверки на поддельные файлы cookie, сервер не может знать, что пользователь удалил приложение и что сессия истекла, пока не была предпринята попытка позвонить в API Facebook.Таким образом, решение проблемы - просто обработать FacebookOAuthExceptions.Обычно это делается путем: 1) повторной попытки вызова API (встроенной в SDK, если вы включаете повторные попытки) и 2) перехвата исключения и перенаправления пользователя на страницу «входа в систему», которая потребует от него повторной установки приложения.

Например,

var app = new FacebookApp();
dynamic result;
try {
  result = app.Get("me");
} catch (FacebookOAuthException) {
  // Redirect here
}
string firstName = result.first_name;

Поскольку нарушение контракта кода с сеансами с запятой, которое обычно только видно, является тестированием.Обычно это происходит из-за того, что тестеры неоднократно добавляли и удаляли приложение.Я полагаю, что где-то в процессе разработки Javascript SDK Facebook файл cookie добавляется, а не перезаписывается.Это приводит к тому, что файл cookie является недействительным, и SDK Facebook C # не может проанализировать недействительный файл cookie.

Следует отметить, что если вы создаете приложение iframe для Facebook, вы никогда не должны использовать файлы cookie.Они чрезвычайно ненадежны в iframes с Facebook по нескольким причинам, на которые я не буду вдаваться.

...