Обновление токенов пользователя Facebook

У меня есть приложение в рельсах, которое в значительной степени основано на Facebook oauth2. Краткий обзор - пользователь входит в систему с помощью FB connect и может перечислять его страницы (и кое-что сделать с этими данными, но это сейчас не важно. Давайте просто сосредоточимся на входе и получении списка страниц).

После входа я сохраняю пользователя access_token а также expires_at в дб. Затем каждый раз, когда мне нужно сделать запрос к api facebook как пользователю (чтобы получить список его страниц), я проверяю, не истек ли expires_at, и если это так, я обновляю токен пользователя, используя следующий фрагмент:

  def refresh_facebook_token
    # Checks the saved expiry time against the current time
    return unless facebook_token_expired?

    # Get the new token
    new_token = facebook_oauth.exchange_access_token_info(
      old_access_token)

    # Save the new token and its expiry over the old one
    self.facebook_auth = {
      uid:          uid,
      access_token: new_token['access_token'],
      expires_at:   Time.now + new_token['expires'].to_i
    }
    save
  end

Это работает в большинстве случаев, но время от времени мой код выдает:

тип: OAuthException, код: 190, код_ошибки: 460, сообщение: ошибка при проверке токена доступа: сеанс не соответствует текущему сохраненному сеансу. Это может быть связано с тем, что пользователь изменил пароль с момента создания сеанса или Facebook изменил сеанс по соображениям безопасности. [HTTP 400]

в соответствии с exchange_access_token_info,

Эта ошибка генерируется моим собственным пользователем, и я могу сказать, что я не менял пароль, поэтому я не уверен, с чем это связано, и как я могу справиться с обновлением токенов с помощью бэкэнда безошибочным способом.

Любая помощь высоко ценится!

1 ответ

Решение

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

Я не уверен, но думаю, что вы рассматриваете метод exchange_access_token_info в качестве освежающего символа. Если это так, это не так! После истечения срока действия токена он становится бесполезным. exchange_access_token_info Метод просто берет короткоживущий токен (который в данный момент активен) и конвертирует его в долгоживущий токен, используя идентификатор приложения и секрет.

Просто пойми это

Токен доступа пользователя не может быть продлен бесконечно снова и снова без какого-либо взаимодействия пользователя с вашим приложением в течение 60 дней.

Таким образом, поток очень прост

  • вы получаете недолговечный токен, когда пользователь аутентифицирует ваше приложение (взаимодействие с пользователем на внешнем интерфейсе)
  • на стороне сервера вы продлеваете срок действия токена до 60 дней.
  • хотите снова продлить срок действия токена? - повторите шаги.

Надеюсь, это поможет!

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