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

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

Приводится следующая причина:

The access token is invalid since the user hasn't engaged the app in longer than 90 days

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

Я получаю такой же ответ для одного из своих веб-приложений. Я использую Hybridauth для управления логинами.

MastaBaba 02.05.2018 02:45

подтверждено, то же самое здесь

Алик Нематов 02.05.2018 02:50

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

MastaBaba 02.05.2018 02:52

У нас такая же проблема ... без изменений с нашей стороны ...

jmcastanos 02.05.2018 04:35

Есть новости по этому поводу?

Max 02.05.2018 07:31

получаю то же сообщение с прошлой ночи (1/5/18)

Ofershap 02.05.2018 08:13

Аналогичная проблема была и для мобильных устройств, описанная здесь: developers.facebook.com/bugs/992564290891053. Это может быть ошибка в FB. Я подниму там вопрос.

Thomas 02.05.2018 09:16

Зарегистрирован баг с FB: developers.facebook.com/bugs/194772814474841

Thomas 02.05.2018 09:32

У меня такая же проблема с использованием hello.js, когда я звоню / мне (github.com/MrSwitch/hello.js), поэтому это не ошибка SpringSocial.

voidstate 02.05.2018 10:44

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

Dr.Flink 02.05.2018 14:42

У меня такая же проблема с паспортом.js

madox2 02.05.2018 23:18

Я использую react-native-fbsdk, и у меня такая же проблема. Кто-нибудь знает жизнеспособное обходное решение для react-native?

Rodrigo Vasconcelos 03.05.2018 18:14

О чувак. Эта проблема вернулась ко мне.

MastaBaba 15.05.2018 04:00

@MastaBaba взгляни: github.com/mavris/FacebookFix

BlackM 15.05.2018 14:35

Спасибо @BlackM. Тем не менее, я использую гибридную аутентификацию.

MastaBaba 15.05.2018 17:01
Почему Facebook остановился на PHP
Почему Facebook остановился на PHP
PHP имеет долгую историю с Facebook, и это был основной язык программирования, использовавшийся для создания сайта в первые годы его существования....
32
15
6 626
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

Нравится

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

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

Мое приложение - это веб-приложение, а не мобильное приложение, и я запрашиваю разрешение email и user_birthday.

Thomas 02.05.2018 09:26

У вас уже есть проблема с запросом разрешения? В моем случае я решаю проблему после добавления разрешения.

Kiyoung Lee 02.05.2018 10:02

Я также использую веб-приложение. И я также уже явно запрашивал определенные разрешения.

MastaBaba 02.05.2018 11:46

Насколько я знаю, разрешение по умолчанию для facebook SDK - это public_profile и электронная почта. если вы не запрашиваете разрешение по умолчанию. Я рекомендую, чтобы у вас было разрешение по умолчанию.

Kiyoung Lee 02.05.2018 14:10

Прежде чем я решу проблему в своем приложении, я не запрашиваю никаких явных разрешений. Но сегодня утром внезапно возникла эта проблема. Итак, я нашел пример кода github для входа в Facebook. Я обнаружил, что часть кода отличается от моего, и образец кода требует разрешения. Наконец я решил проблему в своем приложении. Итак, я думаю, что раньше Facebook SDK поддерживал разрешение по умолчанию, но сегодня оно было изменено.

Kiyoung Lee 02.05.2018 14:18

@KiyoungLee Я просто попробовал и добавил разрешение public_profile по умолчанию, чтобы убедиться, но это не дало никакого эффекта.

Thomas 02.05.2018 16:27

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

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

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

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

Thomas 02.05.2018 09:48

Это не ВАШ токен, это токен ПОЛЬЗОВАТЕЛЯ, срок их действия истекает каждые 90 дней, поэтому они вынуждают нас в таком случае перенаправлять пользователей для повторной подписки на наше приложение.

Ofershap 02.05.2018 09:50

Я с @Thomas: я не храню ничего, связанного с процессом входа в систему, а затем инициирую процесс входа в систему. Итак, все, что могло быть истекшим, было просто представлено мне Facebook при попытке войти в систему с помощью Facebook.

MastaBaba 02.05.2018 11:46

Я использую Laravel Socialite и сталкиваюсь с той же проблемой. Я нигде не храню токены и, честно говоря, не знаю, как заставить код отправлять пользователя обратно на «повторную подписку». Насколько я понимаю, это делает Facebook, и похоже, что Facebook сам должен предлагать моим пользователям повторно одобрить приложение, если они видят, что токен недействителен по этой причине.

vesperknight 02.05.2018 14:07

ответы на facebook:

Thanks for getting in touch. This is actually a known issue that we are already tracking in another bug report.

I'm going to merge your report with the existing one, so we can deal with the issue in one place. Please refer to this thread for updates: http://developers.facebook.com/bugs/194772814474841/

Моим временным решением было использовать JS SDK, в моем случае он работает правильно ...

Это отчет об ошибке, который я подал, как указано в комментарии к моему вопросу. В комментариях к ошибке предлагается несколько обходных путей, но ни один из них не работает для меня. Я не могу перейти на JS SDK. Надеюсь, сегодня мы получим новости от FB.

Thomas 03.05.2018 07:57
Ответ принят как подходящий

Обновлять:

Похоже, что проблема была решена Facebook.


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

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

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

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

Я развернул решение №2 в нашей производственной системе, и оно работает в нашем случае.

Thomas 03.05.2018 14:58

Мы изменили URL-адрес для входа на https://www.facebook.com/v2.10/dialog/oauth?auth_type=reauth‌​orize&client_id=xxx&‌​state=yyy&response_t‌​ype=code&sdk=php-sdk‌​-5.6.2&redirect_uri=‌​xxx&scope=email%2Cus‌​er_gender, но это ничего не изменило. Как вы думаете, мы должны поймать ошибку и затем снова перенаправить пользователя на этот URL?

Mike Reiche 03.05.2018 15:02

@MikeReiche, к счастью, тебе больше не нужно ничего делать

sanmai 04.05.2018 02:08

Ошибка сохраняется согласно обсуждение

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

С Уважением

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

Jason Leung 14.05.2018 14:46

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

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

{
    "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 дней.
  • Нажмите кнопку "Просмотреть и изменить" в приложении с истекшим сроком действия.
  • Во всплывающем окне нажмите «Продлить доступ».

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

Спасибо! Та же ситуация, другое исправление. Я просто удалил тестового пользователя и воссоздал его, так как конкретный пользователь для меня не имел значения. Почему это действительно сгенерирует токен доступа, но немедленный сбой - это странно!

Chris Prince 20.06.2018 06:49

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