OmniAuth与Twitter策略对某些用户间歇性的“invalid_credentials”失败

时间:2012-08-28 06:34:06

标签: ruby-on-rails oauth twitter omniauth twitter-oauth

我实施了OmniAuth + Twitter策略。它适用于大多数用户的大部分时间。但是一些用户已经遇到了一致的失败,我无法重现或追踪它。登录到Twitter后,用户将被重定向到

/auth/failure?message=invalid_credentials

我无法在看到网络流量时在一台用户计算机上运行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登录,你会看到:

user.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上的应用配置了匹配的回调网址和匹配的主机名
  • 密钥和令牌显然是正确的,因为大多数时候它适用于大多数用户
  • 这不是实际错误凭据的问题,因为在这种情况下,用户会在Twitter登录页面上收到有关密码错误的消息,但不会被重定向
  • 一旦用户遇到这种情况,就会一直发生,并且无法在该浏览器上登录。但是,他们可以在其他浏览器上登录。也大约一天后他们可以再次登录
  • 从浏览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)

0 个答案:

没有答案