2016-05-03 6 views
0

У меня есть приложение в рельсах, которое в значительной степени основано на 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 в пуленепробиваемой путь.

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

ответ

1

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

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

Просто понять, что- доступ

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

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

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

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