Как использовать разные области видимости для разных маршрутов в hapi.js, используя keycloack? - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь реализовать авторизацию на основе токенов в hapi.js , используя keycloack.Я создал идентификатор пользователя и клиента в keycloak.У меня есть несколько областей для каждого пользователя в моей настройке.Я генерирую токен, используя имя пользователя, пароль, идентификатор клиента.Затем я получаю доступ к этому токену, чтобы авторизовать каждый мой маршрут.Но проблема возникает, когда разные маршруты должны иметь разную область действия.Таким образом, только если этот пользователь в этой области, маршрут будет авторизован, иначе он не будет.Я использую hapi-auth-jwt2 для аутентификации.Вот часть моего кода:

server.js

    await server.register(require('hapi-auth-jwt2'));    
    server.auth.strategy('jwt', 'jwt', await require('./authorization').authorize());
    server.auth.default('jwt');

authorization.js

const jwk = require('./jwk');

exports.authorize = async () => {
    let pem = await jwk.pem();
    return {
        key: pem,
        validate: (decoded, request) => {
            if (decoded.scope.includes('admin', 'user')) {
                return { isValid: true };
            } else {
                return { isValid: false };

        },
        verifyOptions: { algorithms: [process.env.JWT_ALGORITHM] }

}

rout.js

  //here the scope will be the only admin
    method: 'GET',
    path: '/getalluser',
    config: {
      handler: handler.getIDInfo,
      validate: {
        headers: joi.object({
          authorization: commonSchema.jwtHeader,
        }).options({ allowUnknown: true }),

      },


  },
  //here the scope will be only user.
    method: 'GET',
    path: '/getmyinfo', 
    config: {
      handler: handler.getmyinfo,
      validate: {
        headers: joi.object({
          authorization: commonSchema.jwtHeader,
        }).options({ allowUnknown: true }),

      },


  },

commonSchema.js

const jwtHeader = Joi.string().required();
const unauthorized = Joi.object({
    statusCode: Joi.number().example(401),
    error: Joi.string().example('Unauthorized'),
    message: Joi.string().example('invalid or expired token'),
}).unknown(true);
}

в моем route.js я пытался добавитьэто authenticanticitoon для каждой области:

       auth: {
            strategy: 'jwt',
            scope: ['admin']

Но я получил ошибку, которая была

AssertionError [ERR_ASSERTION]: неизвестная стратегия аутентификации jwt в / getalluser

Моя область настройки keycloack все в порядке.Но я запутался, как я могу использовать разные области действия на каждом маршруте при генерации токена для каждого пользователя?Прямо сейчас, мой весь маршрут работает для каждой области, которую я не хочу

...