【问题标题】:Where to store JWT when connecting to an API in Rails在 Rails 中连接 API 时存储 JWT 的位置
【发布时间】:2018-09-12 00:18:49
【问题描述】:

我有一个 Rails 应用程序,我正在尝试连接到 API。

我已经能够 ping API 并发送表单数据,一切都恢复正常。我的问题是 API 要求您在请求中发送 JWT 身份验证令牌。因此,我提出了这个额外的身份验证请求以获取 JWT,然后将该 JWT 与我正在进行的其他 API 调用一起发送。

API 建议保存初始 JWT,这样我就不必为 JWT 发出额外的身份验证请求。他们建议将其保存一段时间,然后在此之后刷新并获取新的 JWT。该令牌将在 25 小时内有效,因此他们建议在 24 小时后获取一个新令牌,以免在检索新 JWT 时中断任何服务。

我会在哪里存储这个令牌?我在考虑会话或缓存它?我觉得将其存储在会话中可能存在安全问题?

只是寻找有关最佳实践的输入,以及人们将 JWT 存储在其应用程序中的什么位置。也不要费心告诉我我的问题太笼统,否则不是征求意见的地方。我正在做。暴徒生活。

【问题讨论】:

    标签: ruby-on-rails jwt


    【解决方案1】:

    这是一位朋友提出的解决方案。我更喜欢它。使用 Rails 缓存。到目前为止,它似乎对我有用。所以我想我会把它发布给后代。根据您认为适合您自己的应用程序对其进行调整。我不得不稍微调整一下,但本质是一样的。

        def self.fetch_from_api(attributes)
           # use with_token_refresh method here.
           # It will fail if the token is expired, delete the cache, then re-fetch the token.
           with_token_refresh do
             url = build_url(:fetch, attributes[:endpoint], [attributes[:name_id]])
             #call fetch_jwt method and put it in the headers or wherever
             headers = attributes.merge(jwt: fetch_jwt)
             response = execute_request(url, headers(attributes))
             JSON.parse(response)
           end
        end
    
        def self.fetch_jwt
           # will write if nothing cached, or cache expired, read if something cached
           Rails.cache.fetch('jwt' , expires_in: 24.hours) do
              url =  'test.com'
              headers = { secret: 'stuff' }
              body =  'body'
              resp = RestClient.post url, body, headers
              JSON.parse(resp)['access_token']
           end
        end
    
        def self.with_token_refresh
           yield
           rescue StandardError
           # delete jwt, then yield to re-fetch
             Rails.cache.delete('jwt')
             yield
        end
    

    【讨论】:

      【解决方案2】:

      根据auth0

      您将令牌存储在本地存储/会话存储或 cookie 中,每种方法都有不同的注意事项,但通常,所有前端应用程序都使用本地或会话存储。更多信息auth0

      您当然可以更改/更新本地 JWT 令牌以提高您的安全性,但我认为它应该在应用程序(前端)层中处理。但 JWT 令牌安全性应在 API 服务器中处理更多

      【讨论】:

        猜你喜欢
        • 2021-12-21
        • 2019-04-26
        • 2020-07-30
        • 2015-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-01
        相关资源
        最近更新 更多