OmniAuth + Twitter 戦略を実装しました。ほとんどのユーザーにとって、ほとんどの場合に機能します。しかし、一部のユーザーは一貫して失敗しており、私はそれを再現したり追跡したりできませんでした. Twitter にログインすると、ユーザーは次の URL にリダイレクトされます。
/auth/failure?message=invalid_credentials
Web トラフィックを確認できなかったときに、あるユーザーのマシンで HTTP デバッガーを実行できたところ、次のことがわかりました。
302 GET myserver.com/auth/twitter
CONNECT api.twitter.com:443
401 GET myserver.com/auth/twitter/callback?oauth_token=....&oauth_verifier=....
302 GET myserver.com/auth/twitter/callback?oauth_token=....&oauth_verifier=....
401 GET myserver.com/auth/failure?message=invalid_credentials&strategy=twitter
302 GET myserver.com/auth/failure?message=invalid_credentials&strategy=twitter
これがユーザーに対して発生し始めると、一貫して何度も発生し、Cookie をクリアしてブラウザーを再起動しても問題は解決しません。確かではありませんが、前日にログインしてブラウザを開いたままにしているユーザーにのみ発生している可能性があります。
ご覧のとおり、非常に軽量な方法で Twitter ログインを実装しました。
ユーザー.rb:
class User
attr_accessor :name, :screen_name, :twitter_secret, :twitter_token
def initialize(auth)
@screen_name = auth['info']['nickname']
@twitter_secret = auth["credentials"]["secret"]
@twitter_token = auth["credentials"]["token"]
@name = auth["info"]["name"]
end
end
session_controller.rb:
class SessionsController < ApplicationController
def reset_and_auth
reset_session
redirect_to '/auth/twitter?force_login=true'
end
def create
user = User.new(request.env["omniauth.auth"])
session[:current_user] = user
redirect_to root_path, :notice => "Signed in!"
end
def destroy
session.delete(:current_user)
redirect_to root_path, :notice => "Signed out!"
end
def failure
flash[:auth_failure] = params[:message]
redirect_to root_path
end
end
application_controller.rb の関連部分:
helper_method :current_user
と
def current_user
session[:current_user]
end
初期化子/omniauth.rb:
twitter_config = YAML.load_file(File.join(Rails.root,'config','twitter.yml'))[Rails.env]
Rails.application.config.middleware.use OmniAuth::Builder do
provider :twitter, twitter_config['consumer_key'], twitter_config['consumer_secret']
end
その他の興味深いメモ(多くのグーグルの後)
- これは Heroku で実行されているため、サーバーの時刻同期が問題になる可能性はないと思います
- dev.twitter.com のアプリは、一致するコールバック URL と一致するホスト名で構成されています。
- ほとんどの場合、ほとんどのユーザーで機能するため、キーとトークンは明らかに正しいです。
- これは、実際に資格情報が間違っているという問題ではありません。その場合、ユーザーは Twitter のログイン ページでパスワードが間違っているというメッセージを受け取り、リダイレクトされないためです。
- これが 1 人のユーザーに発生すると、一貫して発生し、そのブラウザーにログインできなくなります。ただし、別のブラウザでログインすることはできます。また、約 1 日後に再度ログインできます。
- oauth gem のソースを参照すると、::OAuth::Unauthorized 例外が発生していると思いますhttps://github.com/intridea/omniauth-oauth/blob/master/lib/omniauth/strategies/oauth.rb
宝石のバージョン:
oauth (0.4.6)
omniauth (1.1.0)
hashie (~> 1.2)
rack
omniauth-oauth (1.0.1)
oauth
omniauth (~> 1.0)
omniauth-twitter (0.0.12)
multi_json (~> 1.3)
omniauth-oauth (~> 1.0)
rails (3.2.6)