2

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)
4

0 に答える 0