如何使用omniauth对服务进行经过身份验证的调用?

时间:2011-04-15 09:50:10

标签: ruby-on-rails ruby omniauth netflix

我使用OmniAuth从服务中收到了令牌/秘密,并且可以将其存储给用户,但我对如何实际使用这些来调用服务感到困惑。

我在这个问题上看到的最接近的事是here,但他解决的方式是感觉不对。如果你知道你在做什么,我觉得OmniAuth可能会为你做这一切。

Netflix有一个非常复杂的auth process,所以我希望通过使用OmniAuth从所有这些中抽象出来来避开所有这些。

鉴于我有一个用户的令牌和秘密,如何在调用像Netflix这样的服务时使用它们?

非常感谢:)

2 个答案:

答案 0 :(得分:19)

嘿,我是OmniAuth宝石的作者。 OmniAuth旨在用于身份验证过程。对于像Netflix这样的OAuth提供商,这意味着交换访问令牌的请求令牌,然后用于从API中提取用户信息。这些一次性调用是专门为每个提供商设计的,并且意味着是给定提供商的通用API客户端。

您可以使用OmniAuth 获取凭据,然后使用另一个特定的库来访问网站本身(例如ruby-netflix或其他任何内容,我不知道是什么最好的一个是打电话。您可以通过访问env['omniauth.auth']['credentials']来检索在身份验证舞中获得的访问令牌和机密,然后使用这些来初始化API客户端。

您也可以直接使用OAuth库进行这些调用,但我强烈建议您只使用现有的库,它会更快更容易。所有这些都有意义吗?

答案 1 :(得分:7)

OmniAuth是关于身份验证的;你可能应该看看另一个gem来实际调用该服务。例如,对于Facebook,我使用OAuth2 gem和代码如下:

module Facebook
  class Client < OAuth2::Client
    # Return a new OAuth2::Client object specific to the app.
    def initialize
      super(
        APP_CONFIG[:facebook][:api_key],
        APP_CONFIG[:facebook][:app_secret],
        :site => 'https://graph.facebook.com',
        :parse_json => true
      )
    end
  end

  class Token < OAuth2::AccessToken
    # Return a new OAuth2::AccessToken specific to the app
    # and the user with the given token.
    def initialize(token)
      super(
        Facebook::Client.new,
        token
      )
    end
  end
end

access_token = Facebook::Token.new(users_fb_token)
url          = "https://graph.facebook.com/#{user_fb_id}/feed"
response     = access_token.post(url, :message => "My update")

请注意,流行服务(如Facebook和Twitter)可以管理幕后的内容,例如创建令牌,管理网址等。对于Netflix,您可以查看以下内容:

另请注意,OmniAuth只会向您返回服务数据;你可以自由地存储它并以你的方式使用它(如果你试图超越线路,那么设计OmniAuth会有你自己的模式)。你链接的另一个问题对我来说并不太遥远。