FB Cookies кэшируются в приложении Facebook
Я использую аффинитизированный API Facebook для ColdFusion https://github.com/affinitiz/facebook-cf-sdk для разработки приложения для Facebook, и у меня возникают реальные проблемы с событиями после аутентификации.
API отлично очищает cookie-файлы приложения, и я вхожу в систему, но только с помощью дополнительного вызова шаблона, перезагрузки, если хотите. После перезагрузки все становится на свои места, и я могу получить сеанс пользователя с токеном доступа.
Я разместил вызовы API в Application.cfc в событии OnRequest.
Итак, вот странная вещь, независимо от того, сколько вызовов API я делаю из ColdFusion, единственная вещь, которая даст мне новейший файл cookie приложения, - это перезагрузка шаблона (я делаю это с помощью JavaScript в качестве обходного пути).
Как будто cookie-файл приложения каким-то образом кэшируется и обновляется только при перезагрузке, даже если пользователь проходит проверку подлинности.
Напомним, что процедура выглядит следующим образом:
- Событие по запросу
- API очищает куки
- поэтому мы перезагружаем
- Событие по запросу
- API очищает куки
- у нас есть Facebook UID и access_token.
Это настройки файлов cookie сеанса в Application.cfc.
<cfset THIS.SessionManagement = true />
<cfset THIS.SetClientCookies = true />
<cfset THIS.ClientManagement = true />
Спасибо за вашу помощь!
Код OnRequest довольно обширный, но здесь идет:
import facebook.sdk.FacebookApp;
import facebook.sdk.FacebookGraphAPI;
// Replace this with your appId and secret
APP_ID = "zzz";
SECRET_KEY = "zzz";
API_KEY = "zzz";
session.appID = APP_ID;
session.apiKey = API_KEY;
// Create facebookApp instance
//this.utils.runTimer("facebookAuth-newfacebookApp","start");
facebookApp = new FacebookApp(appId=APP_ID, secretKey=SECRET_KEY);
//this.utils.runTimer("facebookAuth-newfacebookApp","stop");
session.fbApp = facebookApp;
// We may or may not have this data based on a URL or COOKIE based session.
//
// If we get a session here, it means we found a correctly signed session using
// the Application Secret only Facebook and the Application know. We dont know
// if it is still valid until we make an API call using the session. A session
// can become invalid if it has already expired (should not be getting the
// session back in this case) or if the user authenticated out of Facebook.
//this.utils.runTimer("facebookAuth-getUserSession","start");
userSession = facebookApp.getUserSession();
//this.utils.runTimer("facebookAuth-getUserSession","stop");
authenticated = false;
if (structKeyExists(userSession, "uid")) {
if(structKeyExists(session.fbUserSession,"uid")){
if(userSession.uid NEQ session.fbUserSession.uid){
// reset session variables;
}
}
session.fbUserSession = userSession;
try {
facebookGraphAPI = new FacebookGraphAPI(userSession.access_token);
session.fbGraphAPI = facebookGraphAPI;
session.fbGraphAPI = facebookGraphAPI;
if (NOT session.fbAuthenticated){
session.fbAuthenticated = true;
session.justLoggedIn = true;
}
session.fbLoginCounter = 3;
authenticated = true;
} catch (any exception) {
// Ignore exception (OAuthInvalidTokenException), usually an invalid session
} finally {
facebookGraphAPI = new FacebookGraphAPI();
}
} else {
facebookGraphAPI = new FacebookGraphAPI();
session.fbUserSession = StructNew();
//this.utils.runTimer("facebookAuth-FacebookGraphAPI-else","stop");
}
session.parameters = structNew();
session.parameters["req_perms"] = "publish_stream, email";
Затем я могу получить доступ к FB cookie через сеанс.
2 ответа
Мне интересно об этом разделе прямо здесь:
if(structKeyExists(session.fbUserSession,"uid")){
if(userSession.uid NEQ session.fbUserSession.uid){
// reset session variables;
}
}
session.fbUserSession = userSession;
На самом первом запросе есть какое-либо значение в session.fbUserSession.uid? Я бы не догадался. Похоже, вы не устанавливаете это значение до 3-й строки после этого. Означает ли это, что все, что заменяет // сброс переменных сессии, будет вызвано? И это может вызвать у вас некоторые проблемы? Я не знаю, что делает этот код, но похоже, из того, что я вижу, что session.fbUserSession не будет иметь значения для вашей проверки, по крайней мере, до второго запроса. Это означает, что код // сброса переменных сеанса будет каждый раз выполняться по первому запросу. Это то, что вы хотите?
Я только что исправил это. Вызов API из события onRequest в Application.cfc был виновником. У меня сложилось впечатление, что onRequest похож на добавление кода поверх всех шаблонов.cfm.
Я добавил вызовы в открытые шаблоны, и все работает гладко. Каким-то образом файлы cookie сеанса отстают в onRequest даже в том случае, если они сбрасываются только при обновлении.
Если кто-нибудь может пролить свет на то, почему это так, я был бы очень счастлив.