Nosso produto registra novos players em nosso serviço e optamos por hospedá-lo no Azure (estamos usando .NET) e queríamos que fosse sem estado (para escalabilidade) e relativamente seguro.
Como este é o primeiro WS REST que estou escrevendo, eu gostaria de obter algum feedback sobre se é ou não uma solução sólida.
Algumas presunções para saber sobre o nosso aplicativo:
- Os usuários estão logados no serviço anonimamente, sem exigir uma senha de um usuário
- O WS deve ser completamente sem estado para permitir o dimensionamento horizontal
- Estamos nos conectando usando HTTPS (SSL) para impedir a invasão de terceiros
EDITAR:
- Temos como alvo dispositivos iOS / Android nativos
- Nossa principal preocupação é garantir que apenas clientes não violados possam enviar solicitações
E o processo de autenticação abstrata:
- O cliente cria um hash simples (UDID: Timestamp) e o criptografa usando o timestamp com algum algoritmo básico (por exemplo, chave secreta é todo segundo caractere do hash)
- O cliente envia seu UDID, carimbo de data e hora e hash para o servidor
- O servidor reconstrói o hash e descriptografa o hash criptografado enviado pelo usuário
- Se os dois forem iguais - sabemos que ele foi realmente enviado de nosso cliente (e, esperançosamente, não de um remetente malicioso)
Qualquer entrada / sugestão seria ótima - obviamente, já que é a primeira vez que estou lidando com esse problema, talvez eu o tenha projetado incorretamente.
Obrigado!
2ª atualização:
Lendo as especificações de segurança do OAuth, parece que não há resposta real para minha pergunta - já que o cliente e o servidor precisam conhecer as chaves secretas e o cliente é armazenado localmente nos dispositivos móveis de nossos usuários (em oposição a um aplicativo Web).
No guia de segurança do OAuth ( http://hueniverse.com/oauth/guide/security/ ):
Ao implementar o OAuth, é fundamental entender as limitações de segredos compartilhados, simétricos ou assimétricos. O segredo do cliente (ou chave privada) é usado para verificar a identidade do cliente pelo servidor. No caso de um cliente baseado na Web, como um servidor Web, é relativamente fácil manter o segredo do cliente (ou chave privada) em sigilo.
No entanto, quando o cliente é um aplicativo de desktop, um aplicativo móvel ou qualquer outro software do lado do cliente, como applets de navegador (Flash, Java, Silverlight) e scripts (JavaScript), as credenciais do cliente devem ser incluídas em cada cópia do aplicativo . Isso significa que o segredo do cliente (ou chave privada) deve ser distribuído com o aplicativo, o que herda de comprometimento.
Isso não impede o uso do OAuth dentro desse aplicativo, mas limita a quantidade de confiança que o servidor pode ter em tais segredos públicos. Como os segredos não podem ser confiáveis, o servidor deve tratar esse aplicativo como entidades desconhecidas e usar a identidade do cliente apenas para atividades que não exijam nenhum nível de confiança, como coleta de estatísticas sobre aplicativos. Alguns servidores podem optar por proibir esse aplicativo ou oferecer diferentes protocolos ou extensões. No entanto, neste momento, não há solução conhecida para essa limitação.