【问题标题】:Generate secure token for external api Ruby on Rails为外部 api Ruby on Rails 生成安全令牌
【发布时间】:2018-12-21 17:38:06
【问题描述】:

我必须让需要以这种方式相互通信的应用程序:

  • 服务 1 与服务 2 通信,它需要为该用户创建一个新用户和一个令牌。
  • 服务 2 验证它确实是服务 1 发出请求
  • 服务 2 生成令牌供用户使用

我不确定验证服务 1 是否发出请求的“最佳/更好”方式是什么。 截至目前,我正在使用 JWT gem 为用户生成令牌,并一直在开发中使用它为服务 1 生成密钥。

payload =  {data: 'admin'}
admin_key = JWT.encode(payload,Rails.application.secrets.secret_key_base)

我将密钥交给服务 1 发送,然后对其进行解码并检查它是否是我最初发送的内容

def authorize_admin
    payload = request.headers['Authorization']
    raise(ExceptionHandler::MissingToken, Message.missing_token) if payload.blank?
    body = JWT.decode(payload, Rails.application.secrets.secret_key_base)[0].values
    body.include?('admin')
end

这可行,但我担心这可能不是一个安全的选择,或者可能有什么替代方案可以改善这一点。 Rails.application.secrets.secret_key_base 是我的应用程序所独有的,所以我认为这适用于使用 JWT 加密令牌。

总结一下,我的问题:

  1. 我可以在我的 rails 应用程序中使用什么来验证另一个外部应用程序?
  2. 将 JWT 与 secret_key_base 结合使用是为外部 api 创建唯一令牌的安全方法吗?

我已经查看了一些关于 JWT 的其他帖子,但没有一个(我发现)详细介绍了它在 rails 应用程序中与 secret_key_base 一起使用的细节

【问题讨论】:

  • 只有一个想法。但最好得到更有经验的开发人员的意见。生成一组令牌 (SecureRandom.base58) 并将其存储在 Service1 的表中。 Service2 必须发送令牌作为参数来标识自己。如果令牌存在于数据库中,则允许事务。有时 Service2 需要一组新的令牌,旧的令牌会过期。该集合的一个令牌不能连续使用两次。
  • 我喜欢这个想法,我不知道如何更改令牌,我不能将其设置为简单地过期,因为那样就没有访问权限了,你的想法看起来不错解决方法

标签: ruby encryption jwt ruby-on-rails-5


【解决方案1】:

JWT 使用密钥对有效负载进行签名,而不是对其进行加密。签名本质上不是安全的,因为给定输入,它总是会返回相同的输出(即签名的模式开始出现)。为了获得最大的安全性,您可能希望选择使用 AES-256(或更高版本)对有效负载进行加密。

同样在这种情况下,授权标头将始终相同,因为您发送的是使用相同密钥编码的相同有效负载,这意味着我可以使用相同标头从我自己的站点访问服务器 2 并取回用户和令牌。这取决于服务 2 的敏感程度,如果它对每个人都开放以创建用户,那么这并不重要。否则,这可能是一个巨大的安全问题。

两台服务器是如何解耦的?如果服务 2 要与之交互的其他服务数量有限并且它知道它们是什么,则可以使用 CORS 标头来确保只有服务 1 可以接收来自服务 2 的请求。

【讨论】:

  • 如果我知道端点和授权标头,我可以从任何位置向服务 2 发送请求,对吗?来自我自己的网站、curl 等
  • 是的,就像现在一样,如果您有端点和令牌放入授权标头中,您就可以访问该服务。我想要做的是只允许一个用户(服务 1)访问创建用户功能(在数据库中存储电子邮件、名称并生成令牌供用户在访问服务 2 时使用)。我基本上有一个服务负责为另一个服务创建和管理用户,这是一个用于验证电话和地址数据的 api。
  • 如果这些服务可以访问同一个数据库,也许您可​​以拥有一个“管理员”令牌(一些随机密钥),每隔几个小时重新生成和存储一次。服务 1 加密标头中的令牌,服务 2 解密并确认令牌在数据库中并且有效。您可能还想在服务 2 中添加另一个保护措施,以确保请求 url 来自服务 1 并拒绝所有其他流量。
猜你喜欢
  • 2015-11-16
  • 2011-04-01
  • 2018-02-11
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
相关资源
最近更新 更多