Omniauth не обновляет секрет токена OAuth при входе в систему - PullRequest
4 голосов
/ 28 сентября 2011

Я использую Omniauth для аутентификации пользователей через Twitter и Facebook, следуя «стандартному» учебнику по теме ( скринкаст Райана Бейтса , хотя я использую Authlogic, а не Devise).

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

authentications_controller.rb

def create
  omniauth = request.env['omniauth.auth']
  authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])

  if authentication
    # User is already registered with application
    flash[:notice] = 'Signed in successfully.'
    sign_in_and_redirect(authentication.user)
  elsif current_user
    # User is signed in but has not already authenticated with this social network
    current_user.authentications.create!(:provider => omniauth['provider'], :uid => omniauth['uid'], :token => (omniauth['credentials']['token'] rescue nil), :secret => (omniauth['credentials']['secret'] rescue nil))
    current_user.apply_omniauth(omniauth)
    current_user.save

    flash[:notice] = 'Authentication successful.'
    redirect_to root_url
  else
    # User is new to this application
    @user = User.new
    @user.apply_omniauth(omniauth)

    if @user.save
      flash[:notice] = 'User created and signed in successfully.'
      sign_in_and_redirect(@user)
    else
      session[:omniauth] = omniauth.except('extra')
      redirect_to new_user_path
    end
  end
end

user.rb

def apply_omniauth(omniauth)
  self.email = "foo@example.com"
  self.login = omniauth['user_info']['nickname'] if login.blank?
  authentications.build(:provider => omniauth['provider'], :uid => omniauth['uid'], :token => omniauth['credentials']['token'], :secret => omniauth['credentials']['secret'])
end

Есть идеи? Rails 3.0.6 и Ruby 1.8.7

1 Ответ

2 голосов
/ 29 января 2012

Стив, вы можете попробовать следующее:

if authentication
 # Make sure we have the latest authentication token for user
 if omniauth['credentials']['token'] && omniauth['credentials']['token'] != authentication.token
   # puts "Found Invalid token"
   authentication.update_attribute(:token, omniauth['credentials']['token'])
 end
 flash[:notice] = "Signed in successfully"
 sign_in_and_redirect(:user, authentication.user)
elsif ...

Это должно в основном обновлять токен доступа пользователя каждый раз, когда уже зарегистрированный пользователь пытается войти в систему и когда происходит несоответствие токена.

...