Qual é o método preferido para a autenticação de usuários de uma página web de uma maneira RESTful?

StackOverflow https://stackoverflow.com/questions/2010699

Pergunta

Estou desenvolvendo um novo quadro-aplicação web experimental, e eu decidi dar RESTful alguma atenção. Eu ler sobre o básico, e sinto que tenho uma boa bastante a compreensão do RESTful como um conceito.

Eu tenho um sistema instalado e funcionando, usando URLs estritamente para definir 'substantivos' no sistema e tomar dos verbos 'dos ??métodos de solicitação HTTP. Estou usando chamadas javascript ajax para fornecer acesso aos métodos de DELETE e PUT que formulários HTML não pode fornecer. (Sei que essas medidas não são estritamente necessárias para ser RESTful, mas ele satisfaz a 'interface uniforme' exigência).

O problema vem com apátrida-ness e cacheability com autenticação. O modelo padrão para autenticação do usuário em sites envolve um evento de autenticação "login", após o qual (se bem sucedida) de um usuário é "dentro da parede" com uma sessão segura persistente e pode ver e fazer coisas sobre os pedidos subsequentes que os usuários não autenticados não pode. Esta persistência de autenticação parece quebrar RESTful-ness. Caching e apatridia parecem ser quebrado, porque o usuário autenticado provavelmente verá HTML que é diferente do que um usuário não-autenticado vai ver pelo mesmo pedido (por exemplo, pode haver um formulário de login em uma barra lateral para o logged- a usuário).

Usando estratégias WWW-Authenticate para autenticar um usuário apenas sobre os pedidos que exigem autenticação parece ser um passo na direção certa, uma vez que não envolve o conceito de uma sessão segura persistente. No entanto ainda há a questão de como retratar uma "logado" aparência para o usuário final de acordo com o que todos nós temos vindo a esperar de websites.

Assim, no pensamento atual, que é a forma preferida de autenticação alça e permissioning de uma página web de uma forma estritamente RESTful, permitindo ainda para logado decorações no HTML?

Foi útil?

Solução

Esta persistência de autenticação parece quebrar RESTful-ness

Em vez de autenticação de um usuário, você pode pensar sobre a criação de uma sessão. Você será devolvido um novo "Session ID", juntamente com o código de status HTTP apropriado (200: OK, 403: proibido, etc).

O usuário irá provavelmente ver HTML que é diferente do que um não autenticado usuário verá para o mesmo pedido

Você vai estar se perguntando o servidor de lazer: "Você pode me obter o HTML (ou qualquer recurso) para esta sessão ID?". O HTML será diferente com base no "Session ID".

Com este método, não há nenhuma parede para "sessões seguras persistentes". Você está simplesmente agindo em uma sessão.

O substantivo (ou o recurso) representaria a sessão actual, se você optar por este método.

Outras dicas

"O modelo padrão para autenticação do usuário em sites envolve um 'login' evento de autenticação, após o qual (se bem sucedida) de um usuário é 'dentro da parede' com uma sessão segura persistente"

  1. Isto não é realmente correta. É em parte verdade, mas apenas para sites que inventar sua própria autenticação.

  2. Se você usar "digerir autenticação" o navegador deve enviar as credenciais com cada solicitação.

A autenticação Digest - credenciais com cada pedido -. É totalmente RESTful

fazer isso.

Para tornar as coisas um pouco mais simples, você pode calcular o Nonce digerir autenticação com base no tempo de modo que é bom para algum período de tempo (6 minutos, 0,1 hr é bom). Todos poucos minutos um pedido enviará um status 401 e requerem recálculo do digerir.

Uma opção para preservar cachability em intermediários para páginas com elementos específicos do usuário é adicionar a marcação específica do usuário via Ajax. Você servir cada utilização da mesma página, incluindo alguns JavaScript que irá fazer uma solicitação XHR para um recurso que diferente retornos algo baseado no login do usuário. Você, então, mesclar essa dentro da página no lado do cliente. A maior parte da página será então cachable como é o mesmo para todos os usuários.

Outra opção é usar ESI (Edge Side Includes). Com estes, a própria cache pode mesclar diferentes representações para construir o resultado final.

Eu penso nisso como este: O "substantivo" na autenticação do usuário é uma sessão. Portanto, o seu formulário de login usa uma solicitação POST para "criar" uma nova sessão e encerrar a sessão usa uma solicitação DELETE para "apagar" a sessão.

Eu sei o que dizer sobre a persistência de autenticação indo contra sossego, mas os cookies (que dão a ilusão de persistência) são simplesmente uma parte de cada solicitação.

"Esta persistência de autenticação parece quebrar RESTful-ness. Caching e apatridia parecem ser quebrado, porque o usuário autenticado provavelmente verá HTML que é diferente do que um usuário não-autenticado vai ver pelo mesmo pedido"

É ok se a representação do recurso é um pouco diferente com base nas informações de autenticação. A informação de autenticação é parte da mensagem e, portanto, a mensagem ainda é "auto-descritivo". Conceitualmente você ainda está acessando o mesmo recurso, e de edição e links apagados são permitidas transições, não peças adicionais de dados. Controlando o que estão disponíveis transições com base em quem acessa o recurso parece válida para mim.

Re: A resposta de Daniel:

Se uma sessão é um objeto transiente que será rapidamente eliminado, isso não é muito cachable, como qualquer cache que você cria só teria uma vida útil de talvez um dia, mas também continuar a usar o espaço no cache de qualquer maneira.

Não seria melhor criar o usuário como um objeto, e autenticar usando a autenticação Digest, (ou um cookie se você deve). Dessa forma, cada usuário recebe seu próprio cache persistente em vez de um cache que dura um dia e desaparece.

Isso também faz sentido mais lógico para mim, desde que você está fazendo uma diferente página olhar dependendo do usuário, (adicionando 'Olá [nome]' e tal) e a diferença entre o "logado" e "desconectado "estados depende se o usuário está incluído na URL. Se uma determinada pessoa é concedido o acesso a essa url usuário específico depende se eles podem autenticar como aquele usuário.

Se o seu quadro RESTful só vai ser usado pelo seu aplicativo web, e não será usado como uma API para terceiros, não vejo nenhuma razão para que você não pode usar o mesmo esquema de autenticação, como o resto de sua aplicação. Você pode pensar nisso autenticação como uma camada de nível inferior ao nível "aplicação". O nível de aplicação ainda pode permanecer sem estado de uma maneira RESTful puro.

É claro que se você está planejando para criar um web API RESTful, você terá que dar a este mais pensamento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top