Сервис для аутентификации в сервисе (хапи + молекулярный) NodeJS - PullRequest
0 голосов
/ 18 июня 2019

У меня есть разные микроуслуги, разработанные в Hapi + Molecular. Я использовал модуль хапи-молекулярный нпм, чтобы добавить молекулярный в хапи, я использую Redis для транспортировки между службами. Я могу вызвать функции службы A из службы B ... что мне нужно, это добавить аутентификацию для вызова функций других служб. Например, если Сервис A вызывает функцию Сервиса B, он должен пройти аутентификацию, чтобы другие люди не могли подключиться к моим сервисам. Я звоню в такие службы

request.broker.call('users.logout', { });

Я видел модуль imicros-auth для этого, но я не нашел его очень полезным, есть ли другой модуль, который может это сделать, или есть какой-то лучший подход к пользовательскому коду для аутентификации сервис-сервис. Это должно быть похоже на

Если служба вызывает свою собственную функцию, то аутентификация не требуется, если вызывается функция другой службы, она должна быть аутентифицирована Еще одна вещь, которая не должна походить на выборку auth из db или что-то вроде этого, что замедляет ответ службы, может быть на основе токена или что-то вроде этого

1 Ответ

0 голосов
/ 18 июня 2019

Может быть это промежуточное ПО?https://github.com/icebob/moleculer-protect-services

Чтобы использовать это, вы должны сгенерировать токен JWT с именем сервиса для всех сервисов и определить список разрешенных сервисов.Промежуточное программное обеспечение будет проверять JWT.

Вот источник промежуточного программного обеспечения:

const { MoleculerClientError } = require("moleculer").Errors;

module.exports = {

    // Wrap local action handlers (legacy middleware handler)
    localAction(next, action) {
        // If this feature enabled
        if (action.restricted) {

            // Create new handler
            return async function ServiceGuardMiddleware(ctx) {
                // Check the service auth token in Context meta
                const token = ctx.meta.$authToken;
                if (!token)
                    throw new MoleculerClientError("Service token is missing", 401, "TOKEN_MISSING");

                // Verify token & restricted services
                // Tip: For better performance, you can cache the response because it won't change in runtime.
                await ctx.call("guard.check", { token, services: action.restricted })

                // Call the original handler
                return await next(ctx);

            }.bind(this);
        }

        // Return original handler, because feature is disabled
        return next;
    },

    // Wrap broker.call method
    call(next) {
        // Create new handler
        return async function(actionName, params, opts = {}) {
            // Put the service auth token in the meta
            if (opts.parentCtx) {
                const service = opts.parentCtx.service;
                const token = service.schema.authToken;

                if (!opts.meta)
                    opts.meta = {};

                opts.meta.$authToken = token;
            }

            // Call the original handler
            return await next(actionName, params, opts);

        }.bind(this);
    },

};
...