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-файл приложения каким-то образом кэшируется и обновляется только при перезагрузке, даже если пользователь проходит проверку подлинности.

Напомним, что процедура выглядит следующим образом:

  1. Событие по запросу
  2. API очищает куки
  3. поэтому мы перезагружаем
  4. Событие по запросу
  5. API очищает куки
  6. у нас есть 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 даже в том случае, если они сбрасываются только при обновлении.

Если кто-нибудь может пролить свет на то, почему это так, я был бы очень счастлив.

Другие вопросы по тегам