У меня есть приложение в рельсах, которое в значительной степени основано на facebook oauth2. С первого взгляда - пользователь подписывается с FB connect и может перечислить его страницы (и делать некоторые вещи с этими данными, но это не важно сейчас. Давайте просто сосредоточимся на входе и получении списка страниц).Обновление токенов facebook
После регистрации я сохраняю пользователя access_token
и expires_at
в дБ. Затем каждый раз, когда мне нужно сделать запрос к facebook api в качестве пользователя (чтобы получить список его страниц), я проверяю, не истекает ли 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, error_subcode: 460, сообщение: Ошибка проверки маркера доступа: Session делает не соответствует текущей сохраненной сессии. Это может быть связано с тем, что пользователь сменил пароль с момента создания сеанса, или Facebook изменил сеанс по соображениям безопасности. [HTTP 400]
в соответствии с exchange_access_token_info
.
Эта ошибка брошена для моего собственного пользователя, и я могу сказать, что я не изменил пароль, поэтому я не уверен, что вызвано и как я могу справиться с обновлением токенов с помощью backend в пуленепробиваемой путь.
Любая помощь очень ценится!