Desculpe... quero reformular completamente esta pergunta: e pergunteiA mesma perguntasobre segurança da informação agora
O sistema no qual estou trabalhando terá um aplicativo móvel, um portal web e uma API baseada em HTTP.
A pergunta para a qual não consigo encontrar uma resposta:
Preciso implementar os endpoints de token openid connect e/ou oauth e gerar tokens para o cliente acessarmeuAPI? Ou "de alguma forma" permito que o(s) cliente(s) acesse(m) a API usando tokens emitidos pelo provedor de ID aberto do usuário?
Mais informações:
Quero permitir que os usuários possam se registrar e fazer login usando seus IDs do Google/Facebook.
Dentro da API eu armazeno uma tabela de usuários com alguns atributos, mínimos porque não preciso de mais que isso, mas essencialmente:
Tabela users:
- uid
- real_name
- contact_number
- email_address
- is_active
- have_admin_rights
Eu também configuraria uma tabela para os open-ids dos usuários, assim:
Tabela open_ids:
- uid
- user_id (Referências users(uid)
- open_id
(para que um usuário possa usar qualquer um dos Open-IDs que deseja associar à sua conta)
Em outro lugar eu faço referência ao ID do usuário, por exemplo:
Tabela foo:
- uid
- bar
- bla
- last_modified_by_user_id (Referências users(uid))
Atualmente, na minha configuração de teste, tenho uma tabela de "senhas", por exemplo:
Tabela senhas:
- uid
- user_id (Referências users(uid))
- password_hash
(Observação: a ideia é se livrar dessa tabela logo e usar open_id. Mas quais bibliotecas eu escolho depende muito de qual funcionalidade eu implemento e o que uso de fontes externas)
Presumo que preciso armazenar os tokens de acesso, pois prefiro não duplicar os dados dos usuários que já estão em seus perfis de serviços sociais e preciso acessar esses serviços para cada usuário de tempos em tempos. Mas como faço para obter o token de acesso do Cliente (onde o usuário se inscreveu) para a API (que é o recurso compartilhado entre os vários clientes)
O problema não é realmente enviar o token do cliente para a API - posso apenas ter uma função na API para "registrar" um usuário e alguns outros endpoints para quando um usuário estiver sendo autenticado. O problema é que um token de acesso se destina apenas a um cliente específico.
Supondo que NÃO implemente um servidor de autorização e de alguma forma possa usar os serviços do Google, etc: Nos sites do desenvolvedor, por exemplo, para Google, Facebook, posso registrar meu cliente e receber o segredo/ID do cliente, mas então uso as mesmas credenciais de cliente tanto do cliente quanto da API?
Ou talvez as credenciais do cliente sejam mantidas apenas pela API e o serviço front-end dependa da API como uma etapa intermediária quando um usuário se registra? Isso parece terrivelmente perigoso para ser inseguro. Então a API é outro cliente separado aos olhos do provedor OpenID?
Supondo que eu precise implementar um servidor de autorização, preciso também ser um provedor de código aberto? Parece que, neste caso, teria que ser openid-connect porque preciso ter autenticação E autorização. Mas neste caso estou realmente perdido em como realizar o cadastro de novos usuários, e as dúvidas anteriores realmente não desaparecem. Parece que eu deveria ser capaz de permitir que o cliente se conectasse e obtivesse a autenticação/acesso do usuário e os tokens de ID do Open IdP e então "registrasse" o usuário na API.