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.

questionAnswers(1)

yourAnswerToTheQuestion