gpt4 book ai didi

ruby-on-rails - 从 Rails 应用程序调用 API 时,应将 token 存储在哪里?

转载 作者:行者123 更新时间:2023-12-04 16:42:14 26 4
gpt4 key购买 nike

我正在编写一个库来调用第三方 API,以便 Rails 应用程序可以使用它。为了进行身份验证,API 最初使用基本身份验证来返回用于所有其他请求的 token 。 token 的有效期为 1 小时,并且可以使用相同的基本身份验证凭据获取多个 token ,而不会使任何其他 token 失效。

这是我到目前为止所拥有的缩减版本:

# frozen_string_literal: true

require "rest-client"

class AcmeClient
ACME_API_URL = Application.secrets.acme[:url]
ACME_API_KEY = Application.secrets.acme[:key]
ACME_API_SECRET = Application.secrets.acme[:secret]

def health_check
url = ACME_API_URL + "api/health"
token = fetch_token
RestClient.get url, { Authorization: "Bearer #{token}"}
end

private

def fetch_token
url = ACME_API_URL + "/api/token"
response = RestClient::Request.execute(
method: :post,
url: url,
user: ACME_API_KEY,
password: ACME_API_SECRET,
payload: "grant_type=client_credentials"
)
JSON.parse(response.body)["access_token"]
end
end

我已经包含了 health_check方法作为可用 API 端点的示例。

之前只使用现有的 gem 来调用 API,我不确定如何处理返回的 token 。我不想在每次 API 调用之前获取一个新的,因为这看起来不必要地过多,所以我猜将它存储在某个地方是有意义的。

在这种情况下,最好创建一个 acme_tokens带有 token 的数据库表和 expires_at列,然后在每次新的 API 调用之前检查到期时间?

或者,由于对 API 的调用将由我们 Rails 应用程序前端的用户操作引发,我应该将 token 存储在 session 变量中吗?

提前致谢!

最佳答案

所以,我认为你可以使用 rails low-level cache 存储 token 。
修改您的 fetch_token方法如下:

  def fetch_token
Rails.cache.fetch("#{cache_key_with_version}/my_api_token", expires_in: 1.hour) do
url = ACME_API_URL + "/api/token"
response = RestClient::Request.execute(
method: :post,
url: url,
user: ACME_API_KEY,
password: ACME_API_SECRET,
payload: "grant_type=client_credentials"
)
JSON.parse(response.body)["access_token"]
end
end

它会在缓存处于事件状态时返回您的 token ,并在缓存过期时请求新的 token 。
此外,您需要在开发/生产环境中配置您的 cache_store。

关于ruby-on-rails - 从 Rails 应用程序调用 API 时,应将 token 存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58006757/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com