我已经在我的应用程序中使用variuos提供程序实现了Oauth:google,facebook等。 现在我试图为twitter实现oauth而不是登录。由于twitter不提供电子邮件作为身份验证信息的一部分,因此无法实现。但是我仍然希望使用API代表用户检索tweet / send_private_messages所需的一些令牌。
我转到/users/auth/twitter
,重定向到Twitter的同意屏幕,接受,回到我的应用程序,一切正常。我想收获的令牌和秘密在那里,但current_user
是nil
,所以我不能将它们持久保存给用户。似乎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
答案 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