Oauth:在不重置会话的情况下执行回调

时间:2014-12-01 20:19:06

标签: ruby-on-rails ruby devise omniauth

我已经在我的应用程序中使用variuos提供程序实现了Oauth:google,facebook等。 现在我试图为twitter实现oauth而不是登录。由于twitter不提供电子邮件作为身份验证信息的一部分,因此无法实现。但是我仍然希望使用API​​代表用户检索tweet / send_private_messages所需的一些令牌。

我转到/users/auth/twitter,重定向到Twitter的同意屏幕,接受,回到我的应用程序,一切正常。我想收获的令牌和秘密在那里,但current_usernil,所以我不能将它们持久保存给用户。似乎OmniAuth中间件正在重置会话,好像我要登录一样,但我不会!我只想要omniauth哈希数据!

思想?

# Gemfile
# ...
gem 'devise'
gem 'omniauth'
gem 'omniauth-twitter'

# config/routes.rb
# ...
get "/users/auth/twitter/callback", to: 'twitter_oauth_callback#callback'

class TwitterOauthCallbackController < ApplicationController
  before_filter { request.env["devise.skip_trackable"] = true }

  def callback
    current_user.twitter_token = omni_auth.credentials.token
    current_user.twitter_secrent = omni_auth.credentials.secret

    redirect_to user_profile_path(current_user)
  end

  private

  def omni_auth() request.env["omniauth.auth"] end
end

1 个答案:

答案 0 :(得分:0)

对我来说,答案是,使用joust OAuth在没有omniauth的情况下全部完成。有一篇关于how to Oauth1的好文章。

class TwitterTokensController < ApplicationController
  TWITTER_API_URL = 'https://api.twitter.com'
  CALLBACK_URL = 'http://localhost:3000/twitter_tokens/callback'

  def new
    session.delete 'twitter.request_token.token'
    session.delete 'twitter.request_token.secret'
    redirect_to request_token.authorize_url(callback_url: CALLBACK_URL)
  end

  def callback
    current_user.update_attributes(
      twitter_token: access_token.token,
      twitter_secret: access_token.secret
    ) if params[:oauth_verifier].present?

    redirect_to social_integrations_home_path
  end

  private

  def access_token
    @access_token ||= request_token.get_access_token oauth_verifier: params[:oauth_verifier]
  end

  def request_token
    @request_token ||= begin
      if session['twitter.request_token.token'] && session['twitter.request_token.secret']
        OAuth::RequestToken.new(consumer,
          session['twitter.request_token.token'],
          session['twitter.request_token.secret']
        )
      else
        rt = consumer.get_request_token oauth_callback: CALLBACK_URL
        session['twitter.request_token.token'] = rt.token
        session['twitter.request_token.secret'] = rt.secret
        rt
      end
    end
  end

  def consumer
    @consumer ||= OAuth::Consumer.new(
      ENV['TWITTER_ID'], ENV['TWITTER_SECRET'],
      site: TWITTER_API_URL
    )
  end
end