Problema:
Temos uma API RESTful baseada no Spring MVC que contém informações confidenciais. A API deve ser protegida, no entanto, o envio das credenciais do usuário (combinação usuário / senha) com cada solicitação não é desejável. De acordo com as diretrizes REST (e requisitos internos de negócios), o servidor deve permanecer sem estado. A API será consumida por outro servidor em uma abordagem no estilo de mashup.
Requisitos:
O cliente faz uma solicitação para
.../authenticate
(URL não protegido) com credenciais; O servidor retorna um token seguro que contém informações suficientes para o servidor validar solicitações futuras e permanecer sem estado. Provavelmente, isso consistiria nas mesmas informações que o Remember-Me Token da Spring Security .O cliente faz solicitações subsequentes para várias URLs (protegidas), acrescentando o token obtido anteriormente como um parâmetro de consulta (ou, menos desejável, um cabeçalho de solicitação HTTP).
Não se espera que o cliente armazene cookies.
Como já usamos o Spring, a solução deve usar o Spring Security.
Temos batido nossas cabeças contra a parede tentando fazer isso funcionar, por isso espero que alguém por aí já tenha resolvido esse problema.
Dado o cenário acima, como você pode resolver essa necessidade específica?
fonte
Respostas:
Conseguimos fazer isso funcionar exatamente como descrito no OP, e esperamos que alguém possa fazer uso da solução. Aqui está o que fizemos:
Configure o contexto de segurança da seguinte maneira:
Como você pode ver, criamos um personalizado
AuthenticationEntryPoint
, que basicamente apenas retorna a401 Unauthorized
se a solicitação não foi autenticada na cadeia de filtros por nossaAuthenticationTokenProcessingFilter
.CustomAuthenticationEntryPoint :
AuthenticationTokenProcessingFilter :
Obviamente,
TokenUtils
contém algum código privado (e muito específico para cada caso) e não pode ser facilmente compartilhado. Aqui está sua interface:Isso deve levá-lo a um bom começo. Feliz codificação. :)
fonte
validate(...)
método). Isso é importante porque quero que o servidor permaneça sem estado. Eu imaginaria que você poderia usar essa abordagem sem precisar usar o Spring.Você pode considerar a autenticação de acesso Digest . Essencialmente, o protocolo é o seguinte:
Toda essa comunicação é feita por meio de cabeçalhos, que, como jmort253 aponta, geralmente são mais seguros do que a comunicação de material sensível nos parâmetros da URL.
A autenticação Digest Access é suportada pelo Spring Security . Observe que, embora os documentos digam que você deve ter acesso à senha de texto sem formatação do seu cliente, você poderá se autenticar com êxito se tiver o hash HA1 para o seu cliente.
fonte
Em relação aos tokens que transportam informações, o JSON Web Tokens ( http://jwt.io ) é uma tecnologia brilhante. O conceito principal é incorporar elementos de informação (declarações) no token e, em seguida, assinar todo o token para que o fim da validação possa verificar se as declarações são realmente confiáveis.
Eu uso esta implementação Java: https://bitbucket.org/b_c/jose4j/wiki/Home
Há também um módulo Spring (spring-security-jwt), mas não examinei o que ele suporta.
fonte
Por que você não começa a usar OAuth com JSON WebTokens
http://projects.spring.io/spring-security-oauth/
OAuth2 é um protocolo / estrutura de autorização padronizada. Conforme especificação oficial do OAuth2 :
Você pode encontrar mais informações aqui
fonte