У нас есть вызов FB.login, подобный этому:
FB.login(function (response) {
if (response.status === 'connected') {
responseFunction(response.authResponse.userID);
} else {
responseFunction(null);
}
}, { scope: requiredPermissions.concat(optionalPermissions).join(','), return_scopes: true });
Он правильно обнаруживает отмененный вход в систему, если пользователь еще не подключился к приложению. Однако, если пользователь уже подключен, когда он отменяет вход в систему, response
выглядит следующим образом:
authResponse: {
accessToken: "token",
data_access_expiration_time: 1560437437,
expiresIn: 86963,
reauthorize_required_in: 7776000,
signedRequest: "bababa",
userID: "userid"
},
status: "connected"
Почти как успешный ответ на вход К счастью, в ответе также есть поле grantedScopes
, если вход выполнен правильно (из-за опции return_scopes
). Однако использование его для различения 2 кажется ненадежным и хакерским.
Есть ли лучший способ?
Заранее спасибо!
Обновление:
Почему бы вместо этого не использовать FB.getLoginStatus?
Для контекста: в моем случае FB.login используется для предоставления доступа к страницам пользователя. Сам по себе он не используется для входа в приложение.
Я буду счастлив, если кто-то укажет на ошибку в моих рассуждениях. Вот оно:
- Вызов FB.login сразу после FB.getLoginStatus ненадежен из-за модального блока в браузерах. FB.login должен вызываться синхронно в обработчике кликов.
- Результат FB.getLoginStatus может истечь и истечет при его вызове до отображения кнопки, вызывающей FB.login. Пользователь может и будет тратить много времени на этой конкретной странице, прежде чем нажать кнопку.
Вот почему обработчик нажатия кнопки немедленно вызывает FB.login. Это помогает избежать обеих упомянутых проблем.