使用两种不同服务的 JWT 身份验证

JWT authentication with two different services

我们的服务架构目前仅支持客户端身份验证。基于 spring 引导和 spring 安全问题的 Java 服务长期存在 JWT,基于租户供其他服务相互验证。例如渲染服务需要从模板服务中获取模板。 我们现在想要使用 node.js 构建一个用户服务,该服务会为用户颁发短期令牌,以便用户也可以访问其中一些服务,并且只访问用户可见的资源。例如,用户只想在列表中看到他们的模板。

我的问题是:在用户服务上实现/auth资源需要注意什么?我已经设法发布了一个包含所需信息的 JWT,并且显然在用户服务中使用相同的秘密来访问模板服务。但我不确定它是否足够安全。我不得不向用户 JWT 添加一个随机 JID 以使其被模板服务接受(这也是通过 spring 启动实现的)。

是否有我需要注意的安全问题?这种做法是不是太天真了?

这是我的 java 发布 JWT 的脚本代码:

const jwt = require('jwt-simple');
const secret = require('../config').jwtSecret;
const jti = require('../config').jti;

// payload contains userId and roles the user has
const encode = ({ payload, expiresInMinutes, tenantId}) => {
  const now = new Date();
  payload.jti = jti; // this is a UUID - spring security will otherwise not accept the JWT
  payload.client_id = tenantId; // this is required by the template service which supports tenants identified through their clientId
  const expiresAt = new Date(now.getTime() + expiresInMinutes * 60000);
  payload.expiresAt = expiresAt;
  return jwt.encode(payload, secret);
};

我想在用户JWT中加入一些类型信息,这样那些java不允许任何用户访问的服务可以直接拒绝所有用户JWT的访问。或者我可以在这里使用 JTI?将研究 spring 引导如何处理该问题。我可能还必须向所有允许用户访问某些资源的服务添加具有角色区分的 @Secured。 但这些都是技术细节。我真正担心的是,我不确定使用从不同来源发布的 JWT 的整个概念是否足够安全,或者我必须在用户服务中做什么才能做到这一点。

是的,你的想法是正确的,因为你是 jwt 的所有者,这意味着只有你可以编写 jwt,其他人可以阅读但不能修改它。

因此您的用户服务将使用某些信息(例如用户 ID)创建令牌,而另一个服务将解码该 jwt 获取用户 ID 并验证该用户 ID