【问题标题】:Twitter Oauth Strategy with Warden + Devise Authentication Gems for RubyTwitter Oauth 策略与 Warden + 为 Ruby 设计身份验证 Gems
【发布时间】:2011-02-21 13:18:34
【问题描述】:

Devise,基于 Warden 的 Ruby 身份验证 gem(另一个身份验证 gem)不支持将 Twitter Oauth 作为身份验证策略,但 Warden 支持。有一种方法可以在 Devise 中使用 Warden Twitter Oauth 策略,但我无法弄清楚。我在设计配置文件中使用以下块:

  config.warden do |manager|
       manager.oauth(:twitter) do |twitter|
          twitter.consumer_secret = <SECRET>
          twitter.consumer_key  = <KEY>
          twitter.options :site => 'http://twitter.com'
       end
       manager.default_strategies.unshift :twitter_oauth
  end

但我不断收到各种错误消息。有谁知道如何使这项工作?我假设这里还有更多工作要做(配置一个新的链接/路由来与 Warden 交谈,也许向 Devise User 模型添加属性等),但我不知道它们是什么。请帮忙。

【问题讨论】:

  • 你好,问题解决了吗?我正在寻找相同的解决方案
  • 我实际上没有。我暂时改用 mbleigh 的 twitter_auth gem 版本。
  • 现在设计 1.2.rc 支持omniauth。我认为可以真正帮助您解决问题。

标签: ruby-on-rails twitter rubygems oauth devise


【解决方案1】:
# Needed gems. Add to your Gemfile if you are using Rails3.  
gem 'devise'
gem 'warden_oauth'

#models/user.rb
devise :token_authenticatable, :oauthable # <-- Must have these

#/config/initializers/devise.rb
require 'warden_oauth'
config.warden do |manager|
  manager.oauth(:twitter) do |twitter|
    twitter.consumer_secret = '<SECRET>'
    twitter.consumer_key  = '<CONSUMER KEY>'
    twitter.options :site => 'http://twitter.com'
  end
  manager.default_strategies(:scope => :user).unshift :twitter_oauth
end

Warden::OAuth.access_token_user_finder(:twitter) do |access_token|
  User.find_or_create_by(:token => access_token.token, :secret => access_token.secret).tap do |user|
    #... 
  end
end

# Link to "Login With Twitter" somewhere in your view
<%= link_to( "Login With Twitter", user_session_path(:warden_oauth_provider => 'twitter') ) %>

【讨论】:

  • 快速提问... oauthable 兼容 1.0(对于 rails 2.x)还是需要 1.1(rails 3)?
  • 似乎 OAuth 支持已添加到 1.1,因此您可能需要使用 Rails 3。
  • 注意:这仅适用于 Oauth2(Facebook、Git),不适用于 Twitter(Oauth 1.0)。
  • 奇怪的是:认证!未在 :twitter_oauth 策略中声明
【解决方案2】:

Omniauth 让这一切变得简单。有一个 Railscast 关于使用 Omniauth 和 Devise (part 1, part 2)。

【讨论】:

    【解决方案3】:

    此解决方案确实有效。您只需要确保在指定 :warden_oauth_provider => 'twitter' 时调用了受保护的操作,否则 Rails 将直接忽略它。

    要使用上面的示例,请将链接更改为:

    <%= link_to( "Login With Twitter", user_session_path(:warden_oauth_provider => 'twitter'), :method => :post ) %>
    

    【讨论】:

      【解决方案4】:

      尝试检查您是否定义了一个名为 Twitter 的类或模块(您可以通过运行脚本/控制台然后键入 Twitter 来检查),如果定义了,请将其命名为不存在的名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-18
        • 2011-06-10
        • 2014-09-27
        • 2011-04-02
        • 2020-07-03
        • 2011-05-12
        • 1970-01-01
        • 2013-10-10
        相关资源
        最近更新 更多