Olá Jared,
Eu tenho dificuldade em entender como o passaporte lida com escopos. Aqui está o meu cenário:
Eu tenho um armazenamento de token, cada token tem um escopo anexado a ele. Eu tenho algumas rotas que apenas tokens com escopo de administrador podem acessar e outras que exigem acesso normal ao token. No meu aplicativo eu faria algo assim:
app.use('/v1', passaporte.authenticate('portador', { session: false }):
para pegar o caso normal e para rotas específicas que exigem direitos de administrador, eu adicionaria algo assim no middleware da rota, como
.. passaporte.authenticate('bearer', { session: false, scopes: ['admin']})
Isso é suportado pelo passaporte ou tenho que fazer diferente?
Apenas para completar, aqui está o que estou fazendo agora: eu simplesmente adiciono os escopos ao objeto de usuário e uso req.user... e em um estágio posterior eu verifico se a rota e o escopo específicos correspondem.
@mwawrusch Eu tenho uma solução para isso com a qual estou feliz e está funcionando bem, que é uma versão um pouco mais limpa do que você mencionou.
Agora você pode passar um terceiro argumento para o sucesso, e isso é anexado pelo Passport em req.authInfo
passport.use(new BearerStrategy(
function(token, done) {
User.findOne({ token: token }, function (err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
return done(null, user, { scope: 'profile' });
});
}
));
O argumento info pode então ser usado em middleware mais abaixo na cadeia para implementar autorização e controle de acesso.
app.get('/api/userinfo',
passport.authenticate('bearer', { session: false }),
function(req, res, next) {
// access control middleware to check for required scope
if (req.authInfo.scope != 'profile') {
res.statusCode = 403;
return res.end('Forbidden');
}
return next();
}
function(req, res) {
res.json(req.user);
});
O info
é apenas um objeto JSON genérico, portanto, o aplicativo precisará estabelecer convenções para o que é fornecido. Espero que isso também seja útil para implementar middleware de autorização de uso geral.
O recurso coincide com o desenvolvimento de OAuthorize e OAuth2orize , que fazem uso dele. Eles podem ser usados para implementar servidores OAuth 1.0 e 2.0, respectivamente. Acho que vi uma página do Quora sobre esse assunto que você fez. Seria ótimo adicionar isso a isso!
Como sempre, envie-me qualquer feedback. Saúde!
Muito bom, obrigado.
Em sex, 13 de julho de 2012 às 8h36, Jared Hanson <
[email protected]
escrevi:
@mwawrusch Eu tenho uma solução para isso com a qual estou feliz e está funcionando
bem, que é uma versão um pouco mais limpa do que você mencionou.Agora você pode passar um terceiro argumento para o sucesso, e isso é anexado por
Passaporte emreq.authInfo
passport.use(new BearerStrategy( function(token, done) { User.findOne({ token: token }, function (err, user) { if (err) { return done(err); } if (!user) { return done(null, false); } return done(null, user, { scope: 'profile' }); }); } ));
O argumento info pode então ser usado em middleware mais abaixo na cadeia para
implementar autorização e controle de acesso.app.get('/api/userinfo', passport.authenticate('bearer', { session: false }), function(req, res, next) { // access control middleware to check for required scope if (req.authInfo.scope != 'profile') { res.statusCode = 403; return res.end('Forbidden'); } return next(); } function(req, res) { res.json(req.user); });
O
info
é apenas um objeto JSON genérico, portanto, o aplicativo precisará resolver
em convenções para o que é fornecido. Eu estou esperando que isso vai provar
útil para implementar middleware de autorização de uso geral também.O recurso coincide com o desenvolvimento de OAuthorize e OAuth2orize , que fazem uso dele. Elas
podem ser usados para implementar servidores OAuth 1.0 e 2.0, respectivamente. eu acho que
Eu vi uma página do Quora sobre esse assunto que você fez. Seria ótimo para
obter estes adicionados a isso!Como sempre, envie-me qualquer feedback. Saúde!
Responda a este e-mail diretamente ou visualize-o no GitHub:
https://github.com/jaredhanson/passport-http-bearer/issues/2#issuecomment -6966368
Comentários muito úteis
@mwawrusch Eu tenho uma solução para isso com a qual estou feliz e está funcionando bem, que é uma versão um pouco mais limpa do que você mencionou.
Agora você pode passar um terceiro argumento para o sucesso, e isso é anexado pelo Passport em
req.authInfo
O argumento info pode então ser usado em middleware mais abaixo na cadeia para implementar autorização e controle de acesso.
O
info
é apenas um objeto JSON genérico, portanto, o aplicativo precisará estabelecer convenções para o que é fornecido. Espero que isso também seja útil para implementar middleware de autorização de uso geral.O recurso coincide com o desenvolvimento de OAuthorize e OAuth2orize , que fazem uso dele. Eles podem ser usados para implementar servidores OAuth 1.0 e 2.0, respectivamente. Acho que vi uma página do Quora sobre esse assunto que você fez. Seria ótimo adicionar isso a isso!
Como sempre, envie-me qualquer feedback. Saúde!