Этот вопрос задан несколько раз в Stack, но реальных ответов не было. Позвольте мне попытаться объяснить мою ситуацию в любом случае.Facebook OAuth Login - access_token API возвращается «Этот код авторизации был использован»
Мы используем приложение, использующее логин Facebook OAuth2. Этот логин использовался, чтобы нормально работать до прошлой недели, и внезапно это беспокоит нас сейчас.
Flow Применение:
Шаг 1: прессы пользователя войти в систему с помощью кнопки Facebook на нашем сайте
Шаг 2: перенаправлено на Facebook страницу Войти/авторизации
Шаг 3 : При авторизации приложения обратный вызов поступает в наше приложение с кратковременным параметром «код».
Шаг 4: Этот параметр «код» будет заменен на токен доступа на 60 дней с использованием «https://graph.facebook.com/oauth/access_token».
Ошибка на шаге 4:
Когда мы пытаемся обменять короткую жизнь «код» для маркеров доступа, мы получаем эту ошибку от Facebook.
{"error":{"message":"This authorization code has been used.","type":"OAuthException","code":100}}
Наблюдение:
- Для пользователей, которые вновь поступающих к приложению, вышеизложенная ошибка не возникает.
- Для возвращаемого пользователя этот вызов завершается с ошибкой выше.
- Наша заявка действует уже более 9 месяцев, и эта ошибка появилась только в последние 7-10 дней. До этого у нас было тысячи пользователей, которые успешно использовали его.
То, что я уже получил от форумов:
Вот моя интерпретация того, что я прочитал. Может быть неточным. У Facebook есть какая-то странная политика, которая требует, чтобы разработчик приложения поддерживал временный 10-минутный код, пока не истечет 60-дневный код, который был получен во время первого входа. Поэтому мы должны создать cookie с токеном доступа в браузере пользователя. Я даже мог видеть, как люди меняют свой код, чтобы создать куки.
Что меня беспокоит?
- Предлагаемые решения предполагают, что созданный файл cookie будет присутствовать в браузере пользователя всегда. Это плохое предположение, поскольку cookie может быть стерто в любое время.
- У меня есть другое приложение Id/app secret, которое я использую для своей разработки (например, localhost), и это отлично работает. Вход в систему происходит хорошо, но это единственный продукт, у которого есть проблема.
- Эта проблема не произошла на производственной машине в течение почти 10 месяцев с момента запуска приложения, и она внезапно появилась. Хуже всего, я не могу получить никаких записей о последних изменениях, которые нарушают этот поток.
Edit:
Платформа: Python, Google Appengine. Мы не используем никаких SDK для Facebook, мы делаем прямые HTTP-вызовы ко всем URL входа. Вызов: https://graph.facebook.com/oauth/access_token - мы передаем приложение, секрет и код (полученные из facebook) в течение 20 секунд после первого вызова.
Надеюсь, здесь достаточно информации, чтобы показать, что наш код не совсем неверен. Любые советы/указатели от людей, которые столкнулись и решили эту проблему, приветствуются. Если его ошибка в Facebook и Facebook-разработчик заметят, я буду еще счастливее.
Параметр кода можно обменять только на токен доступа пользователя один раз. В вашем вопросе отсутствует какая-либо полезная информация о том, какую платформу/язык вы используете, и каковы ваши точные вызовы API. – CBroe
@CBroe - Спасибо за уведомление. Да, мы понимаем, что параметр кода является одноразовым, и поэтому мы хотим обменять его на access_token, но URL-адрес токена доступа не работает. Я включил информацию о платформе/языке. – Srivatsan