如何使用密钥克隆在hapi.js中为不同的路由使用不同的作用域?

时间:2019-06-25 19:28:05

标签: javascript node.js authentication keycloak hapijs

我正在尝试使用密钥克隆在 hapi.js 中实现基于令牌的授权。我已经在密钥斗篷中创建了用户和客户端ID。在设置中,每个用户都有几个作用域。我正在使用用户名,密码,client_id生成令牌。然后,我正在访问该令牌以授权我的每条路线。 但是会发生问题,当不同的路由时,应该具有不同的范围。因此,仅当该用户在该范围内时,该路由才会被授权,否则将不会被授权。我正在使用 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] }

}

routes.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 中,我尝试为每个作用域添加此身份验证:

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

但是我得到的错误是

  

AssertionError [ERR_ASSERTION]:/ getalluser中的未知身份验证策略jwt

我的密钥克隆设置领域一切正常。但是我很困惑如何在根据每个不同的用户生成令牌时如何在每个路由中使用不同的作用域?现在,我的所有路线都适用于我不想要的每个范围

0 个答案:

没有答案