Когда я вызываю 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 и сообщает об этом моему коду как «нет соединения». Не знаю, что хуже... или что я делаю не так?