我使用OmniAuth从服务中收到了令牌/秘密,并且可以将其存储给用户,但我对如何实际使用这些来调用服务感到困惑。
我在这个问题上看到的最接近的事是here,但他解决的方式是感觉不对。如果你知道你在做什么,我觉得OmniAuth可能会为你做这一切。
Netflix有一个非常复杂的auth process,所以我希望通过使用OmniAuth从所有这些中抽象出来来避开所有这些。
鉴于我有一个用户的令牌和秘密,如何在调用像Netflix这样的服务时使用它们?
非常感谢:)
答案 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会有你自己的模式)。你链接的另一个问题对我来说并不太遥远。