yam.platform.getLoginStatus вызывает обратный вызов без ответа.

Когда я вызываю yam.platform.getLoginStatus сразу после входа в систему с помощью yam.platform.login (показывает всплывающее окно и т. д.), я получаю другой объект, передаваемый обратному вызову, чем когда пользователь уже вошел в систему. В частности, поле «пользователь» отсутствует в объекте ответа LoginStatus, в остальном, насколько я вижу, оно выглядит так же.

У меня есть следующий контроллер для области входа в систему с помощью yammer в моем угловом приложении:

function YammerLoginController($scope, $compile) {

    $scope.isLoggedIn = false;
    $scope.userName = "-";
    $scope.login = function () {
        yam.platform.login(function (response) {
            if (response.authResponse) {
                console.log("logged in");
            }
            refreshLoginStatus();
        });
    }

    refreshLoginStatus(); // initialize values
    function refreshLoginStatus() {
        yam.getLoginStatus(function (response) {
            console.dir(response);
            if (response.authResponse) {
                if (response.user) {
                    console.log("YammerLogin: Logged in as " + response.user.full_name);
                    console.dir(response);
                    $scope.$apply(function () {
                        $scope.isLoggedIn = true;
                        $scope.userName = response.user.full_name;
                    });
                }
                else {
                    console.log("WTF Yammer API!"); // THIS HAPPENS.
                }
            }
            else {
                console.log("YammerLogin: Not logged in.");
                $('#loggedInView').popover("hide");
                $scope.$apply(function () {
                    $scope.isLoggedIn = false;
                    $scope.userName = "-";
                });
            }
        });
    }

Когда контроллер создан, он уже запрашивает текущий статус входа в систему, используя функцию refreshLoginStatus. Если пользователь yammer уже вошел в систему, приложение отобразит имя пользователя и кнопку выхода на странице (сделано с помощью ng-show="isLoggedIn"). Если пользователь не вошел в систему, вместо него будет показана кнопка входа. Когда пользователь нажимает эту кнопку входа в систему, вызывается функция $scope.login, вызывающая yam.platform.login и, в случае успеха, снова вызывает refreshLoginStatus, чтобы получить и установить имя пользователя. В этом сценарии объект, возвращаемый как из login, так и из getLoginStatus, не содержит информации о пользователе, как в сценарии «пользователь уже вошел в систему». Я попытался снова вызвать SDK-API после некоторого тайм-аута, но, видимо, ответ кэшируется — я всегда получаю одно и то же. Только обновление всей страницы очищает текущий ответ, снова запрашивая статус и получая «полный» объект ответа.

Я думал, что это может быть проблема с областью действия, но сейчас я не уверен, проблема ли это в самом SDK. :С

РЕДАКТИРОВАТЬ: я как бы нашел решение, которое, однако, только усугубляет мои проблемы. Судя по всему, запрос действительно кэшируется. Обновление можно принудительно выполнить с помощью «принудительного обновления» на yam.platform.getLoginStatus(callback, [forceRefresh]). Это, однако, дает мне следующую ошибку в консоли браузера:

XMLHttpRequest не может загрузить https://www.yammer.com/platform/login_status.json?client_id=2h4U2Hndg5kdWQ8xxxxxx. В запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Таким образом, доступ к источнику 'http://localhost:9000' запрещен.

По сути, SDK не может полностью получитьLoginStatus и сообщает об этом моему коду как «нет соединения». Не знаю, что хуже... или что я делаю не так?


person Efrain    schedule 09.07.2015    source источник


Ответы (1)


Похоже, что это просто несоответствие в API yam.platform.getLoginStatus или вызываемой соответствующей службе Yammer. Если пользователь входит в систему, вы получаете информацию о пользователе, если он уже вошел в систему, вы ее не получаете. Это просто странно, но, видимо, ничего не поделаешь.

Однако я решил эту проблему, просто всегда получая данные для входа пользователя с помощью отдельного вызова службы REST на /users/current .json после аутентификации сеанса (как только у меня будет токен из getLoginStatus).

person Efrain    schedule 06.08.2015