Аутентификация JWT с двумя разными службами

У нас есть сервисная архитектура, которая в настоящее время поддерживает только аутентификацию клиента. Служба Java, основанная на весенней загрузке и проблемах безопасности Spring, долгоживущий JWT, основанный на арендаторах, позволяющих другим службам проходить аутентификацию друг против друга. Например, службе рендеринга необходимо получить шаблоны из службы шаблонов. Теперь мы хотим создать пользовательский сервис с помощью node.js, который выдает краткосрочные токены для пользователей, чтобы они также получали доступ к некоторым из этих сервисов и получали доступ только к тому ресурсу, который виден пользователю. Например, пользователь хочет видеть в списке только свои шаблоны.

Мой вопрос: на что мне нужно обратить внимание при реализации ресурса /auth в пользовательской службе? Мне удалось выпустить JWT с необходимой информацией и, очевидно, с тем же секретом в пользовательской службе для доступа к службе шаблонов. Но я не уверен, что это достаточно безопасно. Мне пришлось добавить случайный JID в пользовательский JWT, чтобы он был принят службой шаблонов (которая также реализована с помощью весенней загрузки).

Есть ли проблема безопасности, на которую мне нужно обратить внимание? Является ли этот подход наивным?

Это мой код javascript, который выдает 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 Boot справляется с этим. Вероятно, мне также придется добавить @Secured с разграничением ролей для всех служб, которые разрешают пользователям доступ только к некоторым ресурсам. Но это технические детали. На самом деле меня беспокоит то, что я не уверен в том, достаточно ли безопасна вся концепция использования JWT, выпущенных из разных источников, или что мне нужно сделать в пользовательской службе, чтобы сделать это так.


person Pete    schedule 04.09.2020    source источник
comment
Мне не ясна та же самая секретная часть пользовательского сервиса. Какие секреты одинаковы? Как служба шаблонов декодирует JWT, выданный пользовательской службой?   -  person Rupjyoti    schedule 05.09.2020


Ответы (1)


Да, ваша концепция верна, поскольку вы являетесь владельцем jwt, что означает, что только вы можете писать jwt, другие могут его читать, но не могут его изменять.

Таким образом, ваша служба пользователя создаст токен с определенной информацией, такой как идентификатор пользователя, а другая служба будет декодировать этот идентификатор пользователя jwt fetch и проверять этот идентификатор пользователя.

person Nitzy    schedule 04.09.2020
comment
Хорошо, спасибо. Я был просто сбит с толку накладными расходами Spring Security, чтобы выдать что-то, что я могу реализовать с помощью node в нескольких строках кода, и мне было интересно, не упустил ли я какую-то точку. - person Pete; 04.09.2020