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

Posted

技术标签:

【中文标题】使用两种不同服务的 JWT 身份验证【英文标题】:JWT authentication with two different services 【发布时间】:2020-12-23 08:35:46 【问题描述】:

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

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

是否有我需要注意的安全问题?这种做法是否幼稚?

这是我发出 JWT 的 javascript 代码:

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?将研究弹簧靴如何处理。我可能还必须为所有允许用户访问某些资源的服务添加具有角色区分的@Secured。 但这些都是技术细节。我真正担心的是,我不确定使用从不同来源发布的 JWT 的整个概念是否足够安全,或者我必须在用户服务中做什么才能做到这一点。

【问题讨论】:

我不清楚用户服务的同一秘密部分。哪些秘密是相同的?模板服务如何解码用户服务下发的JWT? 【参考方案1】:

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

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

【讨论】:

好的,谢谢。我只是对开销弹簧安全性用于发布一些我可以在几行代码中使用节点实现的东西感到困惑,并且想知道我是否遗漏了一点。

以上是关于使用两种不同服务的 JWT 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

JWT:多客户端身份验证服务器,停止在不同客户端之间使用 jwt?

使用 JWT 联合身份的 REST 身份验证/授权

微服务中的 JWT 身份验证

使用oidc的JWT使用不同数量的客户端进行身份验证

使用 JWT 的移动身份验证

OAuth2:JWT授权授予和客户端凭据授权与JWT客户端身份验证之间的区别是什么?