Estou desenvolvendo uma API REST que requer autenticação. Como a autenticação em si ocorre por meio de um serviço da web externo por HTTP, concluí que distribuiríamos tokens para evitar chamar repetidamente o serviço de autenticação. O que me leva perfeitamente à minha primeira pergunta:
Isso é realmente melhor do que apenas exigir que os clientes usem a autenticação básica HTTP em cada solicitação e fazer chamadas em cache para o serviço de autenticação do lado do servidor?
A solução de autenticação básica tem a vantagem de não exigir uma ida e volta completa ao servidor antes que as solicitações de conteúdo possam começar. Os tokens podem ser potencialmente mais flexíveis no escopo (por exemplo, conceder direitos a recursos ou ações específicos), mas isso parece mais apropriado ao contexto OAuth do que no meu caso de uso mais simples.
Atualmente, os tokens são adquiridos assim:
curl -X POST localhost/token --data "api_key=81169d80...
&verifier=2f5ae51a...
×tamp=1234567
&user=foo
&pass=bar"
O api_key
, timestamp
e verifier
são exigidos por todas as solicitações. O "verificador" é retornado por:
sha1(timestamp + api_key + shared_secret)
Minha intenção é permitir apenas chamadas de partes conhecidas e impedir que as chamadas sejam reutilizadas literalmente.
Isso é bom o suficiente? Underkill? Exagero?
Com um token em mãos, os clientes podem adquirir recursos:
curl localhost/posts?api_key=81169d80...
&verifier=81169d80...
&token=9fUyas64...
×tamp=1234567
Para a ligação mais simples possível, isso parece horrivelmente detalhado. Considerando que a shared_secret
vontade acabará sendo incorporada (no mínimo) a um aplicativo iOS, do qual eu assumiria que pode ser extraído, isso oferece algo além de uma falsa sensação de segurança?