#ruby-on-rails
Вопрос:
У меня большой опыт интеграции стороннего API в Rails, но тогда мне не нужно было каждый раз запрашивать токен. Теперь я подумал, что это похоже, но через 2 недели неиспользования конечной точки оказалось, что срок действия токена истек (хотя, вероятно, этого не должно быть — в ответ я получил "expires_in":2591999
). Я не мог найти никакого современного способа обработки извлечения и хранения токенов где-либо. То, что у меня есть, — это клиент и API, которые адаптированы к неиспользованному токену:
#lib/client.rb
class Client
include ::Errors
API_ENDPOINT = 'https://some_endpoint.net/api/'
ACCESS_TOKEN = Rails.application.credentials.sample_api[:access_token]
def initialize
@access_token = ACCESS_TOKEN
end
def post(path, options = {})
handle_response(client.public_send(:post, path.to_s, options.to_json))
end
attr_reader :access_token
private
def client
@client =
Faraday.new(API_ENDPOINT) do |client|
client.request :url_encoded
client.response :json, content_type: /bjson$/
client.adapter Faraday.default_adapter
client.headers['Accept'] = 'application/json'
client.headers['Content-Type'] = 'application/json'
client.headers['Authorization'] = "Bearer #{access_token}" if access_token.present?
end
end
def handle_response(response)
return response_body(response) if response.success?
raise error_class(response.status)
end
def response_body(response)
return if response.body.blank?
response.body
end
end
С помощью класса API
#lib/api.rb
class Api
def get_account_details(options: {})
client.get('account_details', options)
end
private
def client
@client ||= Client.new
end
end
Поэтому, вероятно, теперь мне нужно реализовать какой FetchToken
-то класс, который будет обрабатывать конечную api/token
точку с некоторыми опциями. Что-то вроде:
class FetchToken
def fetch_access_token
client.get('api/token', sample_options)
end
private
def sample_options
{
username: username,
password: password
}
end
end
Я прав? как должен выглядеть такой класс? где я должен сохранить ответ от api/token
конечной точки, чтобы использовать его в Client
классе как ACCESS_TOKEN
?