Isenção de responsabilidade: sou novo na escola de pensamento REST e estou tentando entender isso.
Portanto, estou lendo esta página, Common REST Mistakes , e descobri que estou completamente confuso com a seção sobre as sessões que são irrelevantes. É o que a página diz:
Não deve haver necessidade de um cliente "fazer login" ou "iniciar uma conexão". A autenticação HTTP é feita automaticamente em todas as mensagens. Os aplicativos clientes são consumidores de recursos, não de serviços. Portanto, não há nada para fazer login! Digamos que você esteja reservando um voo em um serviço da web REST. Você não cria uma nova conexão de "sessão" com o serviço. Em vez disso, você pede ao "objeto criador do itinerário" para criar um novo itinerário para você. Você pode começar a preencher os espaços em branco, mas depois obter um componente totalmente diferente em outro lugar na Web para preencher outros espaços em branco. Não há sessão, portanto não há problema em migrar o estado da sessão entre clientes. Também não há problema de "afinidade de sessão"
Ok, entendi que a autenticação HTTP é feita automaticamente em todas as mensagens - mas como? O nome de usuário / senha é enviado a cada solicitação? Isso não apenas aumenta a área de ataque? Sinto que estou perdendo parte do quebra-cabeça.
Seria ruim ter um serviço REST, por exemplo, /session
que aceite uma solicitação GET, onde você passaria um nome de usuário / senha como parte da solicitação e retornaria um token de sessão se a autenticação fosse bem-sucedida, que poderia ser passado junto com solicitações subsequentes? Isso faz sentido do ponto de vista do REST ou está faltando esse ponto?
Respostas:
Para ser RESTful, cada solicitação HTTP deve conter informações suficientes por si só para que seu destinatário a processe para estar em completa harmonia com a natureza sem estado do HTTP.
Sim, o nome de usuário e a senha são enviados a cada solicitação. Os métodos comuns para fazer isso são autenticação básica de acesso e autenticação de acesso digest . E sim, um bisbilhoteiro pode capturar as credenciais do usuário. Assim, criptografaria todos os dados enviados e recebidos usando o TLS (Transport Layer Security) .
Isso não seria RESTful, pois carrega estado, mas é bastante comum, pois é uma conveniência para os usuários; um usuário não precisa fazer login sempre.
O que você descreve em um "token de sessão" é geralmente chamado de cookie de login . Por exemplo, se você tentar fazer login no seu Yahoo! conta, há uma caixa de seleção que diz "mantenha-me conectado por 2 semanas". Isto é essencialmente dizer (em suas palavras) "mantenha meu token de sessão ativo por 2 semanas se eu fizer login com êxito". Os navegadores da Web enviarão esses cookies de login (e possivelmente outros) a cada solicitação HTTP solicitada.
fonte
Não é incomum que um serviço REST exija autenticação para cada solicitação HTTP. Por exemplo, o Amazon S3 exige que cada solicitação tenha uma assinatura derivada das credenciais do usuário, da solicitação exata a ser executada e da hora atual. Essa assinatura é fácil de calcular no lado do cliente, pode ser verificada rapidamente pelo servidor e é de uso limitado para um invasor que a intercepta (já que se baseia no horário atual).
fonte
Muitas pessoas não entendem os princípios do REST de maneira muito clara, o uso de um token de sessão nem sempre significa que você tem estado, o motivo para enviar nome de usuário / senha com cada solicitação é apenas para autenticação e o mesmo para o envio de um token (gerado pelo login processo) apenas para decidir se o cliente tem permissão para solicitar dados ou não, você só viola as convenções REST quando usa tokens de nome de usuário / senha ou sessão para decidir quais dados serão exibidos! em vez disso, você deve usá-los apenas para autenticação (para mostrar dados ou não)
no seu caso, digo SIM, isso é RESTy, mas tente evitar o uso de sessões nativas de php na API REST e comece a gerar seus próprios tokens de hash que expiram em determinado período de tempo!
fonte
Não, não está errado. O ClientLogin do Google funciona exatamente dessa maneira, com a notável exceção de que o cliente é instruído a ir para a "/ sessão" usando uma resposta HTTP 401. Mas isso não cria uma sessão, apenas cria uma maneira de os clientes se autenticarem (temporariamente) sem passar as credenciais de forma clara e de o servidor controlar a validade dessas credenciais temporárias, conforme entender.
fonte
"Autorização:" cabeçalho HTTP enviado pelo cliente. Básico (texto simples) ou resumo.
Toda a idéia de sessão é fazer com estado aplicações utilizando protocolo sem estado (HTTP) e cliente mudo (web browser), mantendo o estado no lado do servidor. Um dos princípios do REST é "Todo recurso é endereçável exclusivamente usando uma sintaxe universal para uso em links hipermídia" . Variáveis de sessão são algo que não pode ser acessado via URI. O aplicativo verdadeiramente RESTful manteria o estado no lado do cliente, enviando todas as variáveis necessárias por HTTP, preferencialmente no URI.
Exemplo: pesquise com paginação. Você teria URL no formulário
Tem muito em comum com URLs que podem ser marcados como favoritos
fonte
Acho que sua sugestão está correta, se você deseja controlar o tempo de vida da sessão do cliente. Eu acho que a arquitetura RESTful incentiva você a desenvolver aplicativos sem estado. Como o @ 2pence escreveu "cada solicitação HTTP deve conter informações suficientes por si só para que seu destinatário a processe para estar em completa harmonia com a natureza sem estado do HTTP" .
No entanto, nem sempre é esse o caso, às vezes o aplicativo precisa informar quando o cliente faz logon ou logout e manter recursos como bloqueios ou licenças com base nessas informações. Veja minha pergunta de acompanhamento para um exemplo desse caso.
fonte