如何使用 OmniAuth 执行 GET/POST 请求
How to perform GET/POST request using OmniAuth
我正在使用 omniauth-exact gem to authenticate the user to ExactOnline, it works perfectly good but after authenticating the user I also need to query back to ExactAPI 并获取一些数据,以防万一我应该使用 GET,POST
方法之一。
callback
returns 返回用户信息,token
和 refresh token
所以我需要使用访问令牌从 Exactonline API 请求数据使用 omniauth
。我该如何存档。
OmniAuth 实际上只是一个用于验证用户身份的工具。如果您想对 api 执行一些实际上不是身份验证流程一部分的操作,您通常会保存访问令牌并将其与 API 客户端一起使用。
您可以在处理 Omniauth 回调的处理程序中获取令牌:
class class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def exact
auth_hash = request.env["omniauth.auth"]
session[:token] = auth_hash[:credentials][:token]
# ...
end
def
对于 Twitter 或 Facebook 等提供商,有现成的 API 客户端,但在这种情况下,您可能希望使用 Intridea's generic OAuth2 library 创建客户端。
require 'oauth2'
client = OAuth2::Client.new('client_id', 'client_secret', site: 'https://start.exactonline.nl/api')
access_token = OAuth2::AccessToken.new(client, session[:token])
response = access_token.post('/api/v1/something', { foo: :bar })
case response.status
when 201:
# ...
when 401:
# ...
end
我鼓励您创建一个客户端 class 或一个服务对象来处理这个问题 - 不要将它内联到您的控制器中,因为它真的很乱而且很难正确测试。
以下是现有 API 客户的一些示例:
我正在使用 omniauth-exact gem to authenticate the user to ExactOnline, it works perfectly good but after authenticating the user I also need to query back to ExactAPI 并获取一些数据,以防万一我应该使用 GET,POST
方法之一。
callback
returns 返回用户信息,token
和 refresh token
所以我需要使用访问令牌从 Exactonline API 请求数据使用 omniauth
。我该如何存档。
OmniAuth 实际上只是一个用于验证用户身份的工具。如果您想对 api 执行一些实际上不是身份验证流程一部分的操作,您通常会保存访问令牌并将其与 API 客户端一起使用。
您可以在处理 Omniauth 回调的处理程序中获取令牌:
class class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def exact
auth_hash = request.env["omniauth.auth"]
session[:token] = auth_hash[:credentials][:token]
# ...
end
def
对于 Twitter 或 Facebook 等提供商,有现成的 API 客户端,但在这种情况下,您可能希望使用 Intridea's generic OAuth2 library 创建客户端。
require 'oauth2'
client = OAuth2::Client.new('client_id', 'client_secret', site: 'https://start.exactonline.nl/api')
access_token = OAuth2::AccessToken.new(client, session[:token])
response = access_token.post('/api/v1/something', { foo: :bar })
case response.status
when 201:
# ...
when 401:
# ...
end
我鼓励您创建一个客户端 class 或一个服务对象来处理这个问题 - 不要将它内联到您的控制器中,因为它真的很乱而且很难正确测试。
以下是现有 API 客户的一些示例: