2015-08-03 4 views
0

Я работаю над проектом с помощью hapi-auth-jwt. Таким образом, когда пользователь регистрируется получить этот маркерHapi jwt extra auth check id владельца

exports.getUserToken = function getUserToken(user) { 
    var userData = { 
     username: user.username, 
     scope: ['user'], 
     iss: apiConfig.iis, 
     jti: user.id 
    }; 
    var token = { 
     token : Jwt.sign(userData, apiConfig.secret, { expiresInMinutes: apiConfig.expiresInMinutes}) 
    }; 
    return token; 
}; 

и в маршруте

{ 
      method: 'GET', 
     path: internals.resourcePath + '/{userId}', 
     config : { 
       handler : User.findById, 
       validate: Validator.findById, 
       auth: { 
        strategy: 'token', 
        scope: ['user'] 
       } 
     } 
     }, 

но у меня, чтобы сделать другую проверку как (в контроллере для получения одного, обновления и удаления) , чтобы увидеть, если пользователь действительно владелец

var jti = request.auth.credentials.jti; 
var id = +request.params.userId; 
if(id !== jti){ 
    return reply(ReplyUtil.forbidden()); 
} 
var params =request.payload; 
User.findOne 

мне интересно, если есть способ не ч пр мой код дублируется (вроде промежуточного слоя в экспресс)

Является ли это стоит использовать предварительный крюк как

server.ext('onPostAuth' , function(request, reply) { 
    if(request.auth && request.auth.credentials && request.auth.credentials.jti){ 
     var jti = request.auth.credentials.jti; 
     var id = +request.params.userId; 
     if(id !== jti){ 
      return reply(Boom.forbidden()); 
     } 
    } 
    return reply.continue(); 
}); 
+0

Вы можете использовать общий доступ к маршрутам http://hapijs.com/api#route-prerequisites, чтобы проверить право собственности –

+0

@MattHarrison спасибо за то, что сейчас я в двух умах, используя onPostAuth или флаг pre. imo в этом случае onPostAuth кажется яснее, но ... – Whisher

+0

Лично я бы пошел до. Это не глобальная логика, и она лучше документирована в конфигурации вашего маршрута, когда вы просматриваете код через год и пытаетесь понять, что происходит. –

ответ

0

Во-первых, в вашем validateFunc, добавить сферу пользователя его/ее идентификатор:

user.scope.push(user._id); 

Когда вы вызываете функцию обратного вызова в validateFunc, не забудьте передать объект пользователя в качестве учетных данных. Затем на вашем маршруте определите область:

auth: { 
    strategy: 'token', 
    scope: ['admin', 'USER_ID'] 
} 

Надеюсь, что это поможет.