Я не уверен, что вы уже ответили на этот вопрос, но вот что я нашел, работая сам. Даже если пользователь вошел в Facebook, при первой попытке получить сеанс он будет пустым. В примере приложения, которое я нашел, в форму помещается кнопка входа в систему. Однако, если вы это сделаете, пользователю придется нажимать на кнопку, даже если они уже вошли в Facebook. Они больше не будут запрашиваться, но это дополнительное действие пользователя.
Так что в моем приложении и в том, что работало для нескольких других, я обнаружил на форумах просто перенаправить на URL входа. (Если вы проверяете URL-адрес, один из его параметров - «return_session = 1».) Когда он вернется, у вас будет сеанс, и вы сможете продолжить его как обычно.
Но в моем приложении, если у меня нет токена приложения, я также не могу получить этот сеанс, поэтому сначала мне нужно получить токен приложения. Чтобы получить токен приложения, посмотрите отличное описание от http://forum.developers.facebook.com/viewtopic.php?id=56789, поста Dynamoman от 7 мая 2010 года (о четвертом посте).
Одна вещь, с которой я столкнулся, заключается в том, что независимо от того, где я говорю, аутентификация - это «следующая» страница, она переходит на страницу, настроенную на холсте. Таким образом, вместо трех отдельных страниц у меня есть только две, и URL обратного вызова canvas должен обрабатывать любое состояние, в котором он находится.
Мой настоящий код находится внутри фреймворка, поэтому он не применим напрямую; как алгоритм это:
landing page:
if the facebook api token is not loaded,
redirect to the authorization url
try to load the user id // to validate that the session
if the user id is not loaded,
redirect to the loginurl from the facebook api
// if it reaches here, then we have both an api token and a session
authorization page:
get authorization token // see the post for how to do that
redirect back to the page configured as the canvas url
Может быть, есть лучший способ, и я уверен, что кто-то, более знакомый с этим, чем я, мог бы найти лучшее решение или опубликовать общий код.