Facebook Graph API отклоняет вновь созданный токен доступа

Ранее сегодня процесс входа в Facebook нашего веб-приложения перестал работать для некоторых пользователей. Когда мы пытаемся получить текущий профиль, возвращается ошибка. Он утверждает, что токен доступа, который мы только что сгенерировали, перенаправив пользователя в поток входа OAuth, был отклонен.

Указана причина:

Маркер доступа недействителен, так как пользователь не использовал приложение более 90 дней.

Для меня это не имеет смысла, так как мы не храним токен доступа нигде, кроме текущего сеанса, и воссоздаем его каждый раз, когда пользователь входит в Facebook.

Трассировка стека из Spring Social для вызова GET /me выглядит так:

ERR c.s.f.v.resource.AuthenticationResource Exception when connecting with Facebook
org.springframework.social.RevokedAuthorizationException: The authorization has been revoked. Reason: The access token is invalid since the user hasn't engaged the app in longer than 90 days.
        at org.springframework.social.facebook.api.impl.FacebookErrorHandler.handleFacebookError(FacebookErrorHandler.java:85)
        at org.springframework.social.facebook.api.impl.FacebookErrorHandler.handleError(FacebookErrorHandler.java:59)
        at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
        at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:775)
        at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:728)
        at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:702)
        at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:350)
        at org.springframework.social.facebook.api.impl.FacebookTemplate.fetchObject(FacebookTemplate.java:220)
        at org.springframework.social.facebook.api.impl.FacebookTemplate.fetchObject(FacebookTemplate.java:215)

Вероятно, проблема связана с изменениями в API Facebook., но я не вижу, как это повлияет на недолговечные токены доступа, которые мы создаем при каждом входе в систему.


person Thomas    schedule 01.05.2018    source источник
comment
Я получаю тот же ответ для одного из моих веб-приложений. Я использую Hybridauth для управления логинами.   -  person MastaBaba    schedule 02.05.2018
comment
подтверждено, то же самое здесь   -  person Алик Нематов    schedule 02.05.2018
comment
Я заметил, что то же самое происходит и с другим веб-приложением, для которого я использовал код Facebook SDK, сообщенный Facebook всего неделю назад.   -  person MastaBaba    schedule 02.05.2018
comment
У нас такая же проблема... никаких изменений с нашей стороны...   -  person jmcastanos    schedule 02.05.2018
comment
Любое обновление на нем?   -  person Max    schedule 02.05.2018
comment
получаю то же сообщение со вчерашнего вечера (05.01.18)   -  person Ofershap    schedule 02.05.2018
comment
У меня та же проблема с использованием hello.js, когда я вызываю /me (github.com/MrSwitch/hello. js), так что это не ошибка SpringSocial.   -  person voidstate    schedule 02.05.2018
comment
Кто-нибудь знает, будет ли выдан новый идентификатор пользователя для пользователя? В настоящее время мы используем уникальный идентификатор пользователя приложения для идентификации зарегистрированного пользователя в нашей базе данных.   -  person Dr.Flink    schedule 02.05.2018
comment
У меня такая же проблема с паспортом.js   -  person madox2    schedule 03.05.2018
comment
Я использую react-native-fbsdk и у меня такая же проблема. Кто-нибудь знает о жизнеспособном обходном пути для реактивного натива?   -  person Rodrigo Vasconcelos    schedule 03.05.2018
comment
О чувак. Эта проблема вернулась ко мне.   -  person MastaBaba    schedule 15.05.2018
comment
@MastaBaba взгляните: github.com/mavris/FacebookFix   -  person BlackM    schedule 15.05.2018
comment
Спасибо @BlackM. Тем не менее, я использую гибридную аутентификацию.   -  person MastaBaba    schedule 15.05.2018


Ответы (7)


Я столкнулся с этой проблемой, когда наши интеграционные тесты вошли в систему с тестовым пользователем — из Graph API вернулся следующий JSON:

{
    "error": {
        "message": "The access token is invalid since the user hasn't engaged the app in longer than 90 days.",
        "type": "OAuthException",
        "code": 190,
        "error_subcode": 493,
        "fbtrace_id": "F/1z2AsTRx8"
    },
    "timestamp_microsecond": "2018-05-30 11:22:01.353949"
}

Это было более серьезной проблемой, поскольку наши тестовые пользователи не «взаимодействовали» с приложением как таковым. Чтобы исправить это, мне пришлось:

  • Войдите на сайт разработчика FB
  • Найдите нужное приложение
  • Посмотрите в разделе «Роли» -> «Проверить пользователей», чтобы найти подходящего пользователя.
  • Нажмите кнопку «Изменить» для пользователя, а затем нажмите «Войти как этот тестовый пользователь».
  • После входа в систему перейдите в «Настройки» -> «Приложения и веб-сайты».
  • Найдите приложение на вкладке «Просрочено» для приложений, с которыми пользователь не взаимодействовал более 90 дней.
  • Нажмите кнопку «Просмотреть и изменить» в приложении с истекшим сроком действия.
  • Нажмите «Продлить доступ» во всплывающем окне.

Как только я сделал все эти шаги, мой тестовый пользователь (и интеграционные тесты) снова заработал.

person Sam Critchley    schedule 30.05.2018
comment
Спасибо! Та же ситуация, другое решение. Я просто удалил тестового пользователя и создал его заново, так как конкретный пользователь не имел для меня значения. Почему это на самом деле сгенерирует токен доступа, но немедленный сбой - это странно! - person Chris Prince; 20.06.2018


Обновление:

Кажется, проблема только что была исправлена ​​​​Facebook.


Я сообщил об ошибке в Facebook, и в настоящее время (5/3/18) они работают над разрешение.

Здесь и в комментариях к ошибкам предлагается несколько обходных путей. Обобщить:

  1. Добавьте новое разрешение, которое вы ранее не запрашивали, для принудительной повторной авторизации
  2. Перехватите ошибку и повторно авторизуйте пользователя вручную через auth_type=reauthorize
  3. Переключитесь на JS SDK и используйте вход на стороне клиента.

Я выбираю решение № 2, так как оно кажется самым простым.

person Thomas    schedule 03.05.2018
comment
Я развернул решение № 2 для нашей производственной системы, и оно работает в нашем случае. - person Thomas; 03.05.2018
comment
Мы изменили URL-адрес для входа на https://www.facebook.com/v2.10/dialog/oauth?auth_type=reauthorize&client_id=xxx&state=yyy&response_type=code&sdk=php-sdk-5.6.2&redirect_uri=xxx&scope=email%2Cuser_gender, но это ничего не изменило. Как вы думаете, мы должны поймать ошибку и снова перенаправить пользователя на этот URL-адрес? - person Mike Reiche; 03.05.2018
comment
@MikeReiche, к счастью, тебе больше ничего не нужно делать - person sanmai; 04.05.2018

Я нашел эту ссылку в документах FB: Обновление токенов доступа пользователя

В котором упоминается, что через 90 дней пользователи должны повторно установить свой токен, поэтому в случае такой ошибки мы должны просто перенаправить пользователя для повторной регистрации.

Они даже упоминают, что удаляют токены неактивных пользователей в верхней части этого документа. Возможно, они сделали ошибку и удалили все токены пользователей. FB Announcement В любом случае решение состоит в том, чтобы перенаправить пользователей на повторную подписку.

person Ofershap    schedule 02.05.2018
comment
Я тоже это нашел. Проблема в том, что в моем случае пользователь только что прошел процесс входа в систему. Мы всегда обновляем токен пользователя и нигде его не храним, как я написал в вопросе. - person Thomas; 02.05.2018
comment
Это не ВАШ токен, это токен ПОЛЬЗОВАТЕЛЯ, срок действия их токенов истекает каждые 90 дней, поэтому в таком случае они вынуждают нас перенаправлять пользователей для повторной подписки на наше приложение. - person Ofershap; 02.05.2018
comment
Я с @Thomas: я ничего не сохраняю в отношении процесса входа в систему, а затем инициирую процесс входа в систему. Таким образом, все, что могло быть просрочено, было просто представлено мне Facebook при попытке войти в систему через Facebook. - person MastaBaba; 02.05.2018
comment
Я использую Laravel Socialite и сталкиваюсь с той же проблемой. Я нигде не храню токены и, честно говоря, не знаю, как сделать так, чтобы код отправлял пользователя обратно для повторной подписки. Насколько я понимаю, Facebook делает это, и кажется, что Facebook сам должен предлагать моим пользователям повторно одобрить приложение, если они видят, что токен недействителен по этой причине. - person vesperknight; 02.05.2018

Согласно обсуждению, ошибка сохраняется.

Согласно комментарию пользователя в упомянутом обсуждении, мы отозвали разрешения у каждого пользователя нашего приложения, и это сработало. Для этого мы использовали следующий API графа endpoint . Нам пришлось сохранить идентификаторы facebookID пользователей.

С Уважением

person Gaston Perez    schedule 03.05.2018
comment
В моем случае мне также нужно отозвать разрешения каждого пользователя, хотя я не хранил никаких токенов доступа! Любая попытка повторно запросить разрешение также не удалась. Я не понимаю, почему FB не может автоматически и изящно обрабатывать повторные запросы пользователя! Я заметил, что это может быть связано с использованием разрешения user_friends, которое теперь требует дополнительной проверки приложения. - person Jason Leung; 14.05.2018

ВРЕМЕННОЕ РЕШЕНИЕ Для iOS необходимо изменить код SDK, чтобы он поддерживал повторную авторизацию. Чтобы изменить исходный код, вам необходимо загрузить его с помощью CocoaPods. Затем скопируйте в модули следующие функции: https://github.com/mavris/FacebookFix.

person BlackM    schedule 15.05.2018

Добавьте код разрешения в свое приложение

Нравится

Android: fbLoginButton.setReadPermissions(Arrays.asList(EMAIL));

IOS: loginButton.readPermissions = @[@"public_profile", @"email"];

person Kiyoung Lee    schedule 02.05.2018
comment
Мое приложение является веб-приложением, а не мобильным приложением, и я запрашиваю разрешение email и user_birthday. - person Thomas; 02.05.2018
comment
У вас уже есть проблема, если запросить разрешение? В моем случае я решаю проблему после добавления разрешения. - person Kiyoung Lee; 02.05.2018
comment
Я также использую веб-приложение. И я также уже явно запрашиваю определенные разрешения. - person MastaBaba; 02.05.2018
comment
Насколько я знаю, разрешения по умолчанию для facebook SDK — это public_profile и электронная почта. если вы не запрашиваете разрешение по умолчанию. Я рекомендую, чтобы вы содержали разрешение по умолчанию. - person Kiyoung Lee; 02.05.2018
comment
Прежде чем я решу проблему в своем приложении, я не запрашиваю никаких явных разрешений. Но сегодня утром вдруг возникла эта проблема. Итак, я нашел пример кода входа в Facebook на github. Я нашел отличающуюся часть от моего кода и примера кода, который требует разрешения. Наконец я решаю проблему в своем приложении. Поэтому я думаю, что раньше Facebook SDK поддерживал разрешение по умолчанию, но сегодня оно было изменено. - person Kiyoung Lee; 02.05.2018
comment
@KiyoungLee Я только что попробовал и добавил разрешение public_profile по умолчанию, просто чтобы убедиться, но это не дало никакого эффекта. - person Thomas; 02.05.2018