O que é o código de status HTTP correto ao redirecionar para uma página de login?


133

Quando um usuário não está conectado e tenta acessar uma página que requer login, qual é o código de status HTTP correto para um redirecionamento para a página de login?

Estou perguntando porque nenhum dos códigos de resposta 3xx estabelecidos pelo W3C parece atender aos requisitos:

10.3.1 300 Várias opções

O recurso solicitado corresponde a qualquer um de um conjunto de representações, cada um com seu próprio local específico, e as informações de negociação orientadas a agentes (seção 12) estão sendo fornecidas para que o usuário (ou agente de usuário) possa selecionar uma representação preferida e redirecionar sua solicitação para esse local.

A menos que fosse uma solicitação HEAD, a resposta DEVE incluir uma entidade que contenha uma lista de características de recursos e localizações a partir das quais o usuário ou agente de usuário possa escolher o mais apropriado. O formato da entidade é especificado pelo tipo de mídia fornecido no campo de cabeçalho Content-Type. Dependendo do formato e dos recursos do

o agente do usuário, a seleção da opção mais apropriada PODE ser realizada automaticamente. No entanto, esta especificação não define nenhum padrão para essa seleção automática.

Se o servidor tem uma escolha preferida de representação, deve incluir o URI específico para essa representação no campo Localização; agentes de usuário podem usar o valor do campo local para redirecionamento automático. Esta resposta é armazenável em cache, salvo indicação em contrário.

10.3.2 301 movido permanentemente

O recurso solicitado foi atribuído um novo URI permanente e quaisquer referências futuras a este recurso devem usar um dos URIs retornados. Os clientes com recursos de edição de links devem vincular automaticamente as referências novamente ao URI de solicitação a uma ou mais das novas referências retornadas pelo servidor, sempre que possível. Esta resposta é armazenável em cache, salvo indicação em contrário.

O novo URI permanente DEVE ser fornecido pelo campo Localização na resposta. A menos que o método de solicitação foi HEAD, a entidade da resposta DEVE conter uma pequena nota de hipertexto com um hiperlink para os novos URI (s).

Se o código de status 301 for recebido em resposta a uma solicitação que não seja GET ou HEAD, o agente do usuário NÃO DEVE redirecionar automaticamente a solicitação, a menos que possa ser confirmada pelo usuário, pois isso pode alterar as condições sob as quais a solicitação foi emitida.

  Note: When automatically redirecting a POST request after
  receiving a 301 status code, some existing HTTP/1.0 user agents
  will erroneously change it into a GET request.

10.3.3 302 Encontrados

O recurso solicitado reside temporariamente em um URI diferente. Uma vez que o redirecionamento pode ser alterado na ocasião, o cliente deve continuar a usar o Request-URI para solicitações futuras. Esta resposta só pode ser armazenada em cache se indicada por um campo de cabeçalho Cache-Control ou Expires.

O URI temporário DEVE ser fornecido pelo campo Localização na resposta. A menos que o método de solicitação foi HEAD, a entidade da resposta DEVE conter uma pequena nota de hipertexto com um hiperlink para os novos URI (s).

Se o código de status 302 for recebido em resposta a uma solicitação que não seja GET ou HEAD, o agente do usuário NÃO DEVE redirecionar automaticamente a solicitação, a menos que possa ser confirmada pelo usuário, pois isso pode alterar as condições sob as quais a solicitação foi emitida.

  Note: RFC 1945 and RFC 2068 specify that the client is not allowed
  to change the method on the redirected request.  However, most
  existing user agent implementations treat 302 as if it

foram uma resposta 303, executando um GET no valor do campo Location, independentemente do método de solicitação original. Os códigos de status 303 e 307 foram adicionados para servidores que desejam deixar inequivocamente claro que tipo de reação é esperada do cliente.

10.3.4 303 Ver outros

A resposta à solicitação pode ser encontrada em um URI diferente e deve ser recuperada usando um método GET nesse recurso. Esse método existe principalmente para permitir que a saída de um script ativado pelo POST redirecione o agente do usuário para um recurso selecionado. O novo URI não é uma referência substituta para o recurso solicitado originalmente. A resposta 303 não deve ser armazenada em cache, mas a resposta à segunda solicitação (redirecionada) pode ser armazenada em cache.

O URI diferente deve ser fornecido pelo campo Localização na resposta. A menos que o método de solicitação foi HEAD, a entidade da resposta DEVE conter uma pequena nota de hipertexto com um hiperlink para os novos URI (s).

  Note: Many pre-HTTP/1.1 user agents do not understand the 303
  status. When interoperability with such clients is a concern, the
  302 status code may be used instead, since most user agents react
  to a 302 response as described here for 303.

10.3.5 304 Não modificado

Se o cliente executou uma solicitação GET condicional e o acesso é permitido, mas o documento não foi modificado, o servidor DEVE responder com esse código de status. A resposta 304 NÃO DEVE conter um corpo da mensagem e, portanto, é sempre encerrada pela primeira linha vazia após os campos de cabeçalho.

A resposta DEVE incluir os seguintes campos de cabeçalho:

  - Date, unless its omission is required by section 14.18.1 If a

O servidor de origem sem relógio obedece a essas regras e proxies e clientes adicionam sua própria data a qualquer resposta recebida sem uma (como já especificado em [RFC 2068], seção 14.19), os caches funcionarão corretamente.

  - ETag and/or Content-Location, if the header would have been sent
    in a 200 response to the same request
  - Expires, Cache-Control, and/or Vary, if the field-value might
    differ from that sent in any previous response for the same
    variant If the conditional GET used a strong cache validator (see

seção 13.3.3), a resposta NÃO DEVE incluir outros cabeçalhos da entidade. Caso contrário (ou seja, o GET condicional usou um validador fraco), a resposta NÃO DEVE incluir outros cabeçalhos de entidade; isso evita inconsistências entre organismos de entidade em cache e cabeçalhos atualizados.

Se uma resposta 304 indicar uma entidade que não está atualmente em cache, o cache DEVE desconsiderar a resposta e repetir a solicitação sem a condição.

Se um cache usa uma resposta 304 recebida para atualizar uma entrada de cache, o cache DEVE atualizar a entrada para refletir quaisquer novos valores de campo dados na resposta.

10.3.6 305 Usar proxy

O recurso solicitado DEVE ser acessado através do proxy fornecido pelo campo Localização. O campo Localização fornece o URI do proxy. Espera-se que o destinatário repita essa solicitação única por meio do proxy. 305 respostas só devem ser geradas pelos servidores de origem.

  Note: RFC 2068 was not clear that 305 was intended to redirect a
  single request, and to be generated by origin servers only.  Not
  observing these limitations has significant security consequences.

10.3.7 306 (Não utilizado)

O código de status 306 foi usado em uma versão anterior da especificação, não é mais usado e o código é reservado.

10.3.8 307 Redirecionamento temporário

O recurso solicitado reside temporariamente em um URI diferente. Desde o redirecionamento pode ser alterado na ocasião, o cliente deve continuar a usar o Request-URI para solicitações futuras. Esta resposta só pode ser armazenada em cache se indicada por um campo de cabeçalho Cache-Control ou Expires.

O URI temporário DEVE ser fornecido pelo campo Localização na resposta. A menos que o método de solicitação foi HEAD, a entidade da resposta DEVE conter uma pequena nota de hipertexto com um hiperlink para os novos URI (s), uma vez que muitos agentes de usuário pré-HTTP / 1.1 não entendem o status 307. Portanto, a nota deve conter as informações necessárias para um usuário repetir o pedido original no novo URI.

Se o código de status 307 for recebido em resposta a uma solicitação que não seja GET ou HEAD, o agente do usuário NÃO DEVE redirecionar automaticamente a solicitação, a menos que possa ser confirmada pelo usuário, pois isso pode alterar as condições sob as quais a solicitação foi emitida.

Estou usando o 302 por enquanto, até encontrar a resposta correta.

Atualização e conclusão:

O HTTP 302 é melhor, pois é conhecido por ter melhor compatibilidade com clientes / navegadores.


1
Eu diria que o absolutamente óbvio seria retornar uma página 401 e uma página de login sem redirecionar, mas não tenho certeza de quais são suas opções.
Nick Craver

1
@ Nick bom ponto, mas eu temeria efeitos colaterais se eu estivesse construindo um sistema de login clássico.
Pekka 15/05

1
@Pekka - Concordo absolutamente, depende de qual plataforma é essa a forma como tudo pode ser tratado de maneira limpa, também se for a intranet versus a internet que eu acredito ... você normalmente faz autenticação de uma maneira diferente em uma intranet, pelo menos na minha experiência.
Nick Craver

@ Nick With 401 "A resposta DEVE incluir um campo de cabeçalho WWW-Authenticate" - Como posso combinar isso com um banco de dados MySQL? O AuthType Basic e o Digest não se limitam aos arquivos de configuração do apache como .htpassword, etc ...?
Vidar Vestnes

Eu quero um costume login-page, não a pergunta básica navegador de diálogo nome de usuário e senha ...
Vidar Vestnes

Respostas:


66

Eu diria 303 ver outros 302 Encontrados:

O recurso solicitado reside temporariamente em um URI diferente. Uma vez que o redirecionamento pode ser alterado na ocasião , o cliente deve continuar a usar o Request-URI para solicitações futuras. Esta resposta só pode ser armazenada em cache se indicada por um campo de cabeçalho Cache-Control ou Expires.

se encaixa em uma página de login mais de perto na minha opinião. Inicialmente, considerei o 303 see otherque também funcionaria. Depois de pensar um pouco, eu diria que 302 Foundé mais adequado porque o recurso solicitado foi encontrado, existe apenas outra página para percorrer antes de poder ser acessada. A resposta não é armazenada em cache por padrão, o que também é bom.


4
Concordo, mas acho que 302 encontrado indica que o recurso foi encontrado, logo abaixo de outro URL. Ex. Eu quero ver / my-messages / o servidor responder com 302 porque "hoje" minhas mensagens estão localizadas em "/ login /" (em vez de "/ messages /") ... eu uso 302, mas não sinto o contexto é 100% correspondente. Como a página de login é um recurso diferente e não possui o mesmo conteúdo solicitado.
Vidar Vestnes

2
@PHP_Jedi true. 303 pode ser mais apropriado desse ponto de vista. No entanto, o 302 é mais confiável em termos de compatibilidade do cliente.
Pekka 15/05

1
Sim, estou pensando que o 303 pode se encaixar melhor no contexto, pois afirma "A resposta à solicitação pode ser encontrada em um URI diferente". Isso está me dizendo que não é o recurso em si que pode ser encontrado em outro URI, mas apenas a resposta a essa solicitação.
Vidar Vestnes

3
@PHP_Jedi Não tenho certeza se vale a pena dedicar tanto tempo a isso. Tanto os clientes quanto os servidores no mundo http precisam ser extremamente liberais e tolerantes a falhas, portanto, não haverá diferença real se você usar 302ou 303, exceto que 302é melhor conhecido. Acho o nível de detalhe louvável e sempre é bom fazer as coisas direito, mas muito esforço pode ser inútil nessa área específica.
Pekka 15/05

28
FYI: Google emite 302s
David Murdoch

51

Este é um uso indevido do mecanismo de redirecionamento HTTP. Se o usuário não estiver autorizado, seu aplicativo deverá retornar 401 Unauthorized. Caso o usuário esteja autorizado, mas não tenha acesso ao recurso solicitado, 403 Forbiddendeverá ser retornado.

Você deve fazer o redirecionamento no lado do cliente, por exemplo, por javascript. código de status para redirecionamento porque a autorização necessária não existe . Usar 30x para isso não está em conformidade com o HTTP.

Como pensar sobre códigos de status HTTP por Mark Nottingham

401 Não autorizado aciona o mecanismo de autenticação de solicitação do HTTP.

401 Unauthorizedcódigo de status requer presença de WWW-Authenticatecabeçalho que suporta vários tipos de autenticação:

WWW-Authenticate: <type> realm = <realm>

Portador, OAuth, básico, resumo, cookie, etc


20
Um 401 pode não ser apropriado em alguns casos como A server generating a 401 (Unauthorized) response MUST send a WWW-Authenticate header field( RFC ) e nem todos os sistemas de login usam esse cabeçalho.
starbeamrainbowlabs

6
Suponha que você esteja atualizando uma página protegida; o javascript do lado do cliente não terá nenhuma alteração para ser chamado, e o navegador abrirá uma janela de login em vez de redirecionar o usuário para a página de login - portanto, a única maneira é usar um código 30x.
Claude Brisson

2
Golang não pode usar 401 para redirecionamento. Isso significa que devemos usar 30 * para redirecionamentos.
EIMEI

4
@EIMEI seguindo seu raciocínio, se outro idioma ou biblioteca forçar você a usar o 401, a Internet estará condenada. Meu ponto é: o que você diz aponta para um problema com golang (apesar de eu achar que é surpreendente que teria um design tão tornar impossível para enviar 401s!)
Greg

2
@starbeamrainbowlabs Há um rascunho para autenticação HTTP baseada em cookie como uma opção no cabeçalho WWW-Authenticate. Veja: tools.ietf.org/html/draft-broyer-http-cookie-auth-00
aef

12

Eu acho que a solução apropriada é o cabeçalho HTTP 401 (não autorizado).

http://en.wikipedia.org/wiki/HTTP_codes#4xx_Client_Error

O objetivo deste cabeçalho é exatamente isso. Mas, em vez de redirecionar para uma página de login, o processo correto seria algo como:

  • O usuário não logado tenta acessar uma página restrita ao login.
  • sistema identifica que o usuário não está logado
  • O sistema retorna o cabeçalho HTTP 401 e exibe o formulário de login na mesma resposta (não é um redirecionamento).

Essa é uma boa prática, como fornecer uma página 404 útil, com links para o sitemap e um formulário de pesquisa, por exemplo.

Até logo.


20
A RFC declara: "A resposta DEVE incluir um campo de cabeçalho WWW-Authenticate (seção 14.46) contendo um desafio aplicável ao recurso solicitado." Uma resposta 401 é realmente aplicável apenas ao usar um esquema de autenticação HTTP.
bshacklett

4
Nesse caso 403 seria melhor uma vez que afirma que o acesso é simplesmente proibido e cabeçalho de autorização não vai ajuda
olanod

O @bshacklett WWW-Authenticate pode ser usado junto com muitos esquemas de autenticação (por exemplo, Bearer, OAuth). Veja developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… e iana.org/assignments/http-authschemes/http-authschemes.xhtml
filip26

Há um rascunho para autenticação HTTP baseada em cookie como uma opção no cabeçalho WWW-Authenticate. Veja: tools.ietf.org/html/draft-broyer-http-cookie-auth-00
aef
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.