Passport-http-bearer: Como funcionam os escopos?

Criado em 5 mar. 2012  ·  3Comentários  ·  Fonte: jaredhanson/passport-http-bearer

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?

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

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!

Todos 3 comentários

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 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á 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

Esta página foi útil?
0 / 5 - 0 avaliações