2010-05-19 78 views
4

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

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模型添加属性等),但我无法弄清楚它们是什么。请帮忙。

+0

嘿,你解决了这个问题吗?我正在寻找相同的解决方案 – 23tux 2011-02-15 04:49:47

+0

我其实没有。我暂时使用mbleigh的twitter_auth gem版本。 – 2011-02-15 04:49:47

+0

Devise 1.2.rc现在支持omniauth。我认为可以帮助你解决问题。 – shingara 2011-02-21 08:26:48

回答

4
# 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')) %> 
+0

快速的问题......可以兼容1.0(for rails 2.x)或者你需要1.1(rails 3)吗? – 2010-08-12 15:09:48

+0

看来OAuth支持被添加到了1.1,所以你可能需要在Rails 3上。 – 2010-08-13 00:37:33

+0

注意:这只适用于Oauth2(Facebook,Git),而不适用于Twitter(Oauth 1.0)。 – 2010-09-07 19:07:54

0

此解决方案确实工作。在指定warden_oauth_provider =>'twitter'时,你只需确保你正在调用受保护的动作,否则Rails将会忽略它。

要使用上面的例子,改变它的链接:

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

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