我已经从使用 OmniAuth 的服务中收到了一个令牌/秘密,并且可以为用户存储它,但我不知道如何实际使用这些来调用服务。
我见过的最接近这个问题的是here,但他解决的方式感觉不对。如果您知道自己在做什么,我觉得 OmniAuth 可能会为您完成这一切。
Netflix 有一个相当复杂的身份验证过程,所以我希望通过使用 OmniAuth 将我从所有这些中抽象出来,从而避开所有这些。
鉴于我有一个用户的令牌和秘密,如何在调用像 Netflix 这样的服务时使用它们?
非常感谢 :)
嘿,我是 OmniAuth gem 的作者。OmniAuth 旨在用于身份验证过程。对于像 Netflix 这样的 OAuth 提供商,这意味着将请求令牌交换为访问令牌,然后用于从 API 中提取用户信息。这些一次性调用是专门为每个提供者设计的,并不意味着是给定提供者的通用 API 客户端。
您可以使用 OmniAuth获取凭据,然后使用站点本身的另一个特定库(例如ruby-netflix
或其他任何东西,我不确定什么是最好的)进行调用。您可以通过访问检索在身份验证舞蹈中获得的访问令牌和秘密env['omniauth.auth']['credentials']
,然后使用它们来初始化 API 客户端。
您也可以直接使用 OAuth 库进行这些调用,但我强烈建议您只使用现有的库,这样会更快更容易。这一切有意义吗?
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 模式,如果您尝试越界,您可能会遇到这种情况)。您链接的另一个问题对我来说并不太牵强。