Autenticação REST e HMAC / chave privada (quando eu configuro?)
Eu tenho andado por aí com uma simples ideia de aplicação nos últimos dias, enquanto estou tentando aprender o básico da autenticação REST.
Até agora eu juntei que omelhor maneira de fazer isso é com uma implementação do HMAC como a usada pela Amazon.
Minha maior preocupação é com exatamente como eu devo autenticar o usuárioe dar-lhes sua chave privada para que eles possam começar a assinar o HMAC? Eu continuo lendo que a chave privada usada para assinar o HMAC não deve ser enviada pelo fiosempre, mas como eles conseguem isso em primeiro lugar?
Minha ideia era algo assim, mas não tenho certeza se isso é válido.
Tabela de banco de dados para usuários:
users (simplified, this would probably be a private key per client app?)
id (their public key?)
username
password?
privatekey
Supondo um cliente HTML / JS, o usuário seria apresentado a uma página de login tradicional que envia POST para a API com algo assim:
https://example.com/myapp/api/v1/authenticate.json
POST: username / password
Isso retornaria
404:User not found
200:{ "id" : <id>, "privatekey": <privatekey> }
O cliente então armazenaria essa chave em algum lugar (o armazenamento local / cookie seria um local seguro?) E a usaria para assinar outras solicitações semelhantes a essa.
GET https://example.com/myapp/api/v1/something/?key1=value1&publickey={theirID}&hmac={hmac signature of the request using their private key}
O servidor então checaria a chave pública, recuperaria a chave privada associada e reconstruiria a assinatura HMAC, se eles corresponderem, temos um processo de solicitação autenticado.
Estou conseguindo isso certo? Não tenho certeza se entendi o papel de uma chave privada se ainda precisar de uma senha como no meu exemplo, então algo está me dizendo que posso estar errado.