У нас есть сервисная архитектура, которая в настоящее время поддерживает только аутентификацию клиента. Служба 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, выпущенных из разных источников, или что мне нужно сделать в пользовательской службе, чтобы сделать это так.