Como alguém lida com autenticação (local e Facebook, por exemplo) usando passport.js, por meio de uma API RESTful em vez de por uma interface da Web?
Preocupações específicas estão lidando com a passagem de dados de retornos de chamada para uma resposta RESTful (JSON) vs usando um res.send típico ({data: req.data}), configurando um terminal de início / login que redireciona para o Facebook (/ login não pode ser acessado via AJAX, porque não é uma resposta JSON - é um redirecionamento para o Facebook com um retorno de chamada).
Encontrei https://github.com/halrobertson/test-restify-passport-facebook , mas estou tendo problemas para entendê-lo.
Além disso, como o passport.js armazena as credenciais de autenticação? O servidor (ou é serviço?) É suportado pelo MongoDB, e eu espero que as credenciais (login e hash salgado de pw) sejam armazenadas lá, mas não sei se o passport.js tem esse tipo de recurso.
fonte
passport-facebook
. Depois que você começar a trabalhar, o próximo passo é começar a entender como o Passport funciona e como ele armazena credenciais. Conectá-lo ao Restify ( veja aqui uma versão atualizada da mencionada) seria uma das últimas etapas (ou você pode implementar a interface REST no Express).Respostas:
Há muitas perguntas feitas aqui, e parece que, embora as perguntas sejam feitas no contexto do Node e do passport.js, as perguntas reais são mais sobre fluxo de trabalho do que como fazer isso com uma tecnologia específica.
Vamos usar a configuração de exemplo do @Keith, modificada um pouco para aumentar a segurança:
https://example.com
serve um aplicativo cliente Javascript de página únicahttps://example.com/api
fornece suporte ao servidor para aplicativo rich clienthttps://example.com/api
https://example.com/api
mas não conhecem o servidor da Web emhttps://example.com
.Observe que estou usando HTTP seguro. Na minha opinião, isso é obrigatório para qualquer serviço disponível ao ar livre, pois informações confidenciais como senhas e tokens de autorização estão passando entre o cliente e o servidor.
Autenticação de nome de usuário / senha
Vamos ver como a autenticação antiga simples funciona primeiro.
https://example.com
https://example.com/api
para obter os dados específicos do usuário a serem renderizados na página. Todas as solicitações enviadas ao serviço da Web incluirão o nome de usuário e a senha, possivelmente na forma de autenticação HTTP Basic , pois o serviço RESTful não tem permissão para manter o estado do cliente de uma solicitação para a próxima. Como o serviço da Web está em HTTP seguro, a senha é criptografada com segurança durante o trânsito.https://example.com/api
recebe um monte de solicitações individuais, cada uma com informações de autenticação. O nome de usuário e a senha em cada solicitação são verificados no banco de dados do usuário e, se encontrados corretamente, a função solicitada é executada e os dados são retornados ao cliente no formato JSON. Se o nome de usuário e a senha não corresponderem, um erro será enviado ao cliente na forma de um código de erro HTTP 401.O ponto importante deste exemplo é que os serviços da Web RESTful requerem autenticação com cada solicitação .
Uma camada adicional de segurança nesse cenário adicionaria autorização de aplicativo cliente, além da autenticação do usuário. Por exemplo, se você tiver os aplicativos cliente da Web, iOS e Android usando o serviço da Web, poderá desejar que o servidor saiba qual dos três é o cliente de uma determinada solicitação, independentemente de quem é o usuário autenticado. Isso pode permitir que seu serviço da web restrinja determinadas funções a clientes específicos. Para isso, você pode usar chaves e segredos da API. Consulte esta resposta para obter algumas idéias sobre isso.
Autenticação do Facebook
O fluxo de trabalho acima não funciona para a conexão com o Facebook porque o login via Facebook possui terceiros, o próprio Facebook. O procedimento de login exige que o usuário seja redirecionado para o site do Facebook, onde as credenciais são inseridas fora do nosso controle.
Então, vamos ver como as coisas mudam :.
https://example.com
https://example.com/auth/facebook
.https://example.com/auth/facebook
rota é tratada pelo passport.js (consulte a documentação )https://example.com/auth/facebook/callback
https://example.com/auth/facebook/callback
rota invocará a função de retorno de chamada que recebe o token de acesso do Facebook e algumas informações do usuário do Facebook, incluindo o endereço de e-mail do usuário.https://example.com/api
incluirão o token de acesso do Facebook para autenticação ou o próprio token de acesso do aplicativo gerado a partir do token do Facebook por meio de uma função "get_access_token" na API REST.Espero que isso responda à maioria das perguntas. É claro que você pode substituir o Facebook pelo Twitter, Google ou qualquer outro serviço de autenticação baseado em OAuth.
Eu estaria interessado em saber se alguém tem uma maneira mais simples de lidar com isso.
fonte
Every single request they send to the web service will include the username and password
e, no entanto, dizyou can have a "get_access_token" function in your RESTful service
. Parece contraditório dizer que o REST precisa ser sem estado, mas armazenar os tokens de acesso do lado do servidor é OK, pois esse ato de armazenar tokens de acesso significa que o servidor agora está com estado. Gostaria de receber qualquer esclarecimento ou justificativa sobre isso. Obrigado! :)Agradeço imensamente a explicação de @ Miguel com o fluxo completo em cada um dos casos, mas gostaria de adicionar um pouco à parte de Autenticação do Facebook.
O Facebook fornece um SDK Javascript que você pode usar para obter o token de acesso diretamente no cliente, que é passado ao servidor e usado para extrair ainda mais todas as informações do usuário do Facebook. Portanto, você não precisa de redirecionamentos basicamente.
Além disso, você também pode usar o mesmo ponto de extremidade da API para aplicativos móveis. Basta usar o Android / iOS SDK para Facebook, obter o access_token do Facebook no final do cliente e passá-lo para o servidor.
Em relação à natureza sem estado, conforme explicado, quando get_access_token é usado para gerar um token e passado ao cliente, esse token também é armazenado no servidor. Portanto, é tão bom quanto um token de sessão e acredito que isso o torna estável.
Apenas meus 2 centavos ..
fonte
Aqui está um artigo incrível que eu achei que pode ajudá-lo a se autenticar com:
Autenticação fácil de nó: instalação e local
fonte