Я использую API Facebook affinitiz для ColdFusion https://github.com/affinitiz/facebook-cf-sdk для разработки приложения Facebook, и у меня возникают реальные проблемы с событиями после аутентификации.
API просто очищает файл cookie приложенияхорошо, и я вошел в систему, но только с помощью дополнительного вызова шаблона, перезагрузите, если хотите.После перезагрузки все становится на свои места, и я могу получить сеанс пользователя с токеном доступа.
Я поместил вызовы API в Application.cfc в событии OnRequest.
Итак, вот странная вещь, независимо от того, сколько вызовов API я делаю из ColdFusion, единственная вещь, которая даст мне новейший файл cookie приложения, - это перезагрузка шаблона (я делаю это с помощью JavaScript в качестве обходного пути).
Как будто cookie-файл приложения каким-то образом кэшируется и обновляется только при перезагрузке, даже если пользователь прошел проверку подлинности.
Подводя итог, процедура выглядит следующим образом:
- Событие OnRequest
- API очищает cookie
- , поэтому мы перезагружаем
- Событие OnRequest
- API очищает cookie
- У нас есть 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 через сеанс.