Estou projetando um serviço da web RESTful que precisa ser acessado pelos usuários, mas também por outros serviços e aplicativos da web. Todas as solicitações recebidas precisam ser autenticadas. Toda a comunicação ocorre por HTTPS. A autenticação do usuário vai funcionar com base em um token de autenticação, adquirido pelo POST do nome de usuário e senha (em uma conexão SSL) para um recurso / sessão fornecido pelo serviço.
No caso de clientes de serviço da Web, não há usuário final por trás do serviço de cliente. As solicitações são iniciadas por tarefas agendadas, eventos ou algumas outras operações do computador. A lista de serviços de conexão é conhecida de antemão (obviamente, eu acho). Como devo autenticar essas solicitações provenientes de outros serviços (web)? Quero que o processo de autenticação seja o mais fácil possível de implementar para esses serviços, mas não à custa da segurança. Qual seria o padrão e as melhores práticas para um cenário como este?
Opções que posso pensar (ou que me foram sugeridas):
Faça com que os serviços ao cliente recorram a um nome de usuário e senha "falsos" e os autentique da mesma forma que os usuários. Eu não gosto dessa opção - ela simplesmente não parece certa.
Atribua um ID de aplicativo permanente para o serviço do cliente, possivelmente uma chave de aplicativo também. Pelo que entendi, isso é o mesmo que ter nome de usuário + senha. Com essa id e chave, posso autenticar cada solicitação ou criar um token de autenticação para autenticar outras solicitações. De qualquer forma, não gosto dessa opção, porque qualquer pessoa que conseguir o ID e a chave do aplicativo pode se passar pelo cliente.
Eu poderia adicionar uma verificação de endereço IP à opção anterior. Isso tornaria mais difícil realizar solicitações falsas.
Certificados de cliente. Configurar minha própria autoridade de certificação, criar certificado raiz e criar certificados de cliente para os serviços de cliente. No entanto, algumas questões vêm à mente: a) como eu ainda permito que os usuários se autentiquem sem certificados eb) quão complicado é este cenário de implementar do ponto de vista do serviço ao cliente?
Outra coisa - deve haver outras soluções por aí?
Meu serviço estaria rodando em Java, mas eu deliberadamente deixei de fora informações sobre em qual framework específico ele seria construído, porque estou mais interessado nos princípios básicos e não tanto nos detalhes de implementação - presumo que a melhor solução para isso será ser possível implementar independentemente da estrutura subjacente. No entanto, sou um pouco inexperiente neste assunto, portanto, dicas e exemplos concretos sobre a implementação real (como bibliotecas de terceiros úteis, artigos, etc.) também serão muito apreciados.