如何使用Omniauth写入某人的Facebook或Twitter墙?

时间:2011-02-07 19:36:32

标签: facebook ruby-on-rails-3 twitter authorization omniauth

我知道Omniauth只是用于身份验证,它并不包含FB或Twitter工具。

但是,假设我的Rails 3应用程序使用Omniauth,现在我的系统中已经注册了一些用户。

我怎么才能张贴到他们的墙上?或者我还需要其他类型的授权系统吗?

感谢您的任何指示。

2 个答案:

答案 0 :(得分:4)

我发现此链接允许我发布到Facebook和Twitter。非常好的教程:

http://blog.assimov.net/post/2358661274/twitter-integration-with-omniauth-and-devise-on-rails-3

答案 1 :(得分:1)

我在设置连接到twitter的应用程序时使用了本指南:

http://philsturgeon.co.uk/news/2010/11/using-omniauth-to-make-twitteroauth-api-requests

帮助了我一点,希望它能为你做同样的事。


原帖

发布时间:2010年11月16日

使用出色的用户系统gem Devise和名为OmniAuth的gem,您可以轻松地创建一个Rails应用程序,通过Twitter,Facebook,Gowalla等登录或注册用户。但是,一旦用户登录,您如何代表刚刚获得授权的帐户实际与API进行交互?

这篇文章从RailsCasts离开的地方开始,所以如果你还没有使用Devise和OmniAuth,那么你可能想看一下:

所以,假设我们都在第三个视频结束的时刻,我们都准备好了。我将使用Twitter的例子,但实际上任何使用oAuth的提供者都会使用相同的方法。就像我们使用Twitter用户名和密码验证API请求的“你们以前的日子”一样,我们现在使用访问令牌和令牌秘密。您可以将这些视为与验证API请求的目的基本相同,对我们来说,它们是。

要获取令牌和密码,您需要在身份验证表中添加一些字段:

rails g migration AddTokenToAuthentications token:string secret:string
rake db:migrate

现在数据库已准备好保存凭据,我们可以更改身份验证代码以填充字段。假设您将方法放在user.rb中,如RailsCast#236建议,然后打开user.rb并修改以下行:

authentications.build(:provider => omniauth['provider'], :uid => omniauth['uid'])

并将其替换为:

authentications.build(
  :provider => omniauth['provider'],
  :uid => omniauth['uid'],
  :token => omniauth['credentials']['token'],
  :secret => omniauth['credentials']['secret']
)

现在每当有人验证他们的帐户时,我们都可以保存他们的凭据,这些凭据是从OmniAuth的内部隐藏魔法传回的。

下一步是使用这些保存的凭据实际发出一些请求,这在Twitter Developer Documentation中几乎完美地描述。您将要安装oauth gem(将其放入Gemfile并运行bundle install),然后您可以使用以下代码从用户测试转储推文列表:

class TwitterController < ApplicationController

    def recent_tweets
      # Exchange your oauth_token and oauth_token_secret for an AccessToken instance.

      def prepare_access_token(oauth_token, oauth_token_secret)
        consumer = OAuth::Consumer.new("APIKey", "APISecret"
            { :site => "http://api.twitter.com"
            })
        # now create the access token object from passed values
        token_hash = { :oauth_token => oauth_token,
                       :oauth_token_secret => oauth_token_secret
                     }
        access_token = OAuth::AccessToken.from_hash(consumer, token_hash )
        return access_token
      end

      auth = current_user.authentications.find(:first, :conditions => { :provider => 'twitter' })

      # Exchange our oauth_token and oauth_token secret for the AccessToken instance.
      access_token = prepare_access_token(auth['token'], auth['secret'])

      # use the access token as an agent to get the home timeline
      response = access_token.request(:get, "http://api.twitter.com/1/statuses/user_timeline.json")

    render :json => response.body
  end
end

通过从current_user.authentications中提取内容(我发现第一个在我的应用程序中,他们应该只有一个)我可以获取凭据并拥有完整的权限来获取他们最近的推文,发布新的推文,查看朋友的推文等

现在我可以调整一下,保存一些东西,然后使用JSON,并采取我需要的东西。与Facebook或任何其他oAuth提供商合作将以几乎相同的方式工作,或者如果直接方法不如您所希望的那样,您可以安装特定的宝石与其API进行交互。

原帖的结尾