Я использую OmniAuth, чтобы получить доступ к Facebook в своем приложении.Я использую гем fb_graph: https://github.com/nov/fb_graph для публикации в Facebook.Я запускаю omniauth-0.3.0 на Heroku для этого приложения.Токен, который я сохраняю при создании пользователя, изменяется, когда пользователь входит в систему позже.
Код для создания пользователя
class SessionsController < ApplicationController
def create
auth = request.env["omniauth.auth"]
user = User.find_by_provider_and_uid(auth["provider"], auth["uid"])||
User.create_with_omniauth(auth)
session[:user_id] = user.id
redirect_to root_url, :notice => "Signed in!"
end
Модель пользователя:
def self.create_with_omniauth(auth)
create! do |user|
user.provider = auth["provider"]
user.uid = auth["uid"]
user.name = auth["user_info"]["name"]
user.token = auth["credentials"]["token"]
end
end
Сейчас я вижу эту ошибку примерно у 30% пользователей -
FbGraph::InvalidToken (OAuthException :: Error validating access token: Session does not match current stored session. This may be because the user changed the password since the time the session was created or Facebook has changed the session for security reasons.)
Я обнаружил, что проблема с просроченным токеном была недавно исправлена в OmniAuth:
https://github.com/soopa/omniauth/commit/67bdea962e3b601b8ee70e21aedf5e6ce1c2b780
Я использовал этот код, который пытается обновить токен доступа.Тем не менее, я все еще получаю ту же ошибку.Может кто-то указать на то, что мне не хватает? Есть ли какой-нибудь другой способ, которым я мог бы обновлять токен каждый раз, когда пользователь входит в систему?
Единственное работающее решение - это создание нового пользователя каждый раз, когда пользователь входит в систему (мне это решение совсем не нравится):
def create
auth = request.env["omniauth.auth"]
user = User.create_with_omniauth(auth)
session[:user_id] = user.id
redirect_to root_url, :notice => "Signed in!"
end
Спасибо!