8

我已经从使用 OmniAuth 的服务中收到了一个令牌/秘密,并且可以为用户存储它,但我不知道如何实际使用这些来调用服务。

我见过的最接近这个问题的是here,但他解决的方式感觉不对。如果您知道自己在做什么,我觉得 OmniAuth 可能会为您完成这一切。

Netflix 有一个相当复杂的身份验证过程,所以我希望通过使用 OmniAuth 将我从所有这些中抽象出来,从而避开所有这些。

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

非常感谢 :)

4

2 回答 2

23

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

您可以使用 OmniAuth获取凭据,然后使用站点本身的另一个特定库(例如ruby-netflix或其他任何东西,我不确定什么是最好的)进行调用。您可以通过访问检索在身份验证舞蹈中获得的访问令牌和秘密env['omniauth.auth']['credentials'],然后使用它们来初始化 API 客户端。

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

于 2011-04-24T20:36:02.873 回答
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")

请注意,有一些流行服务的 gems,比如 Facebook 和 Twitter,可以管理幕后的事情,比如创建令牌、管理 URL 等。对于 Netflix,您可以检查以下内容:

还要记住,OmniAuth 只是将服务数据返回给您;您可以随意存储和使用它(Devise 有它自己的 OmniAuth 模式,如果您尝试越界,您可能会遇到这种情况)。您链接的另一个问题对我来说并不太牵强。

于 2011-04-18T05:39:24.460 回答