【发布时间】: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 加密令牌。
总结一下,我的问题:
- 我可以在我的 rails 应用程序中使用什么来验证另一个外部应用程序?
- 将 JWT 与 secret_key_base 结合使用是为外部 api 创建唯一令牌的安全方法吗?
我已经查看了一些关于 JWT 的其他帖子,但没有一个(我发现)详细介绍了它在 rails 应用程序中与 secret_key_base 一起使用的细节
【问题讨论】:
-
只有一个想法。但最好得到更有经验的开发人员的意见。生成一组令牌 (
SecureRandom.base58) 并将其存储在 Service1 的表中。 Service2 必须发送令牌作为参数来标识自己。如果令牌存在于数据库中,则允许事务。有时 Service2 需要一组新的令牌,旧的令牌会过期。该集合的一个令牌不能连续使用两次。 -
我喜欢这个想法,我不知道如何更改令牌,我不能将其设置为简单地过期,因为那样就没有访问权限了,你的想法看起来不错解决方法
标签: ruby encryption jwt ruby-on-rails-5