Обновление токенов пользователя 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 дней.
- хотите снова продлить срок действия токена? - повторите шаги.
Надеюсь, это поможет!