O Discourse possui um sistema para gerar chaves de API por usuário caso um protocolo muito específico seja seguido. Esse recurso facilita o acesso de “aplicações” às instâncias do Discourse sem a necessidade de envolver moderadores.
Descrição geral
De forma geral:
-
O cliente (aplicativo de desktop, plug-in de navegador, aplicativo móvel) gera um par de chaves privada/pública e uma URL de retorno.
-
O cliente redireciona para uma rota no Discourse, fornecendo sua chave pública ao Discourse.
-
O Discourse obtém a aprovação do usuário para usar o aplicativo.
-
O Discourse gera uma chave de API do usuário.
-
O Discourse redireciona de volta para a URL de retorno com uma carga útil criptografada usando a chave pública da API, contendo a chave de API do usuário.
Detalhes
Casos de uso:
-
Aplicativos de desktop que consultam sites do Discourse em nome dos usuários finais para obter contagens de notificações em vários sites.
-
Aplicativos móveis que consultam sites do Discourse em nome dos usuários finais e gerenciam notificações push.
-
Aplicativos da web que fornecem um painel para usuários finais sobre vários sites do Discourse.
-
Integrações personalizadas com aplicativos de terceiros que consomem o Discourse como parte de um aplicativo corporativo geral. Ex.: integrar notificações da comunidade do Discourse ao aplicativo Hopscotch.
O design:
Configurações do site
-
allow_user_api_key_scopes: escopos de acesso permitidos para chaves de API de usuário. Os escopos são definidos aqui. Os escopos integrados disponíveis são:
read,write,message_bus,push,one_time_password,notifications,session_info,bookmarks_calendar,user_status(plug-ins podem registrar escopos adicionais). -
user_api_key_allowed_groups: controla quais grupos têm permissão para gerar chaves de API de usuário (padrão: administradores, moderadores e trust_level_0)
-
allowed_user_api_push_urls: lista de sites que podem ser destinos para notificações push
-
allowed_user_api_auth_redirects: destinos de redirecionamento permitidos após a geração da chave de API de usuário
Configurações globais
- max_user_api_reqs_per_minute: 50
- max_user_api_reqs_per_day: 4000
Elementos de UX
Se alguma chave de API de usuário tiver sido concedida, o Discourse exibe uma aba aplicativos na página do usuário.
A aba aplicativos listará:
- O nome do aplicativo, por exemplo: (“Discourse Notifier”)
- Data do último uso
- Data de aprovação
- Lista de escopos de acesso concedidos
- Um botão revogar acesso para que você possa revogar facilmente quaisquer chaves
Interface de autorização de chave de API
Cada chave precisará ser explicitamente autorizada pelos usuários finais em uma página que explique claramente o que está acontecendo, por exemplo:
“Discourse Notifier” está solicitando o seguinte acesso à sua conta:
- Ler e limpar notificações
- Ler informações de sessão do usuário
- Criar um token de login único
[Autorizar]
Fluxo de geração de chave de API
A API requer apenas uma única solicitação GET do lado do usuário.
https://nomedosite.com/user-api-key/new
A partir do Discourse 2.1, essas chaves de API de usuário agora expiram automaticamente se ficarem sem uso por longos períodos. A configuração do site:
revoke user api keys unused daysestá definida como 180 por padrão.
Parâmetros:
- auth_redirect: URL para redirecionar de volta com o token gerado
- application_name: o nome do aplicativo que está fazendo a solicitação (será exibido na aba Aplicativos da conta do usuário)
- client_id: um identificador exclusivo para o cliente
- nonce: um nonce exclusivo gerado pelo cliente. Isso será ecoado de volta na carga útil criptografada para que o cliente possa verificar a autenticidade da resposta
- scopes: lista separada por vírgulas de escopos de acesso permitidos para a chave, consulte
allow user api key scopespara a lista completa de escopos disponíveis - push_url: URL para enviar notificações push (obrigatório e válido apenas se
pushounotificationsestiverem incluídos nos escopos) - public_key: a parte pública do par de chaves gerado pelo cliente
- padding (opcional): o modo de preenchimento RSA a ser usado para criptografar a carga útil. Os valores aceitos são
pkcs1(padrão) ouoaep. O OAEP é recomendado para novos aplicativos
Depois que /user-api-key/new for chamado com os parâmetros corretos, duas coisas podem acontecer
- Se o usuário não estiver conectado, redirecionaremos para o login (após o login, retomaremos a autorização)
- Uma vez que o usuário esteja conectado, ele será apresentado à interface de autorização
Após a autorização ser permitida, o sistema redirecionará de volta para a URL definida em auth_redirect e incluirá um parâmetro payload criptografado contendo um objeto JSON com a chave de API de usuário gerada (key), o nonce, o status de push (push) e a versão da API (api). Se o escopo one_time_password foi solicitado, um parâmetro de consulta oneTimePassword criptografado separado também será incluído. O client_id não é ecoado de volta para segurança extra.
Verificando a versão da API
A API de chave de uso no Discourse é versionada. Os clientes podem verificar a versão da API de um site do Discourse fazendo uma solicitação HEAD para https://nomedosite.com/user-api-key/new. A resposta conterá um cabeçalho chamado Auth-Api-Version contendo o número da versão da API do site.
Consumindo a API
Consumir a API do cliente será um pouco diferente da API de administrador atual.
O cliente pode especificar 2 cabeçalhos:
User-Api-Key (obrigatório): a chave que foi gerada
e
User-Api-Client-Id (opcional): forneça isso para atualizar o ‘client id’ armazenado para esta chave de API no banco de dados.
Uma vez que esses cabeçalhos são especificados, o cliente pode realizar solicitações contra a API como faria normalmente.
Gerando uma senha de login único
A partir da versão 4, a API inclui um escopo especial: o escopo one_time_password, que permite que os clientes usem a chave de API do usuário para gerar uma senha de uso único. Se o cliente incluir este escopo ao gerar a chave de API seguindo as etapas acima, um oneTimePassword criptografado será incluído como um parâmetro de consulta separado no redirecionamento de volta para o cliente.
Alternativamente, o cliente pode fazer uma solicitação GET para /user-api-key/otp com os seguintes parâmetros:
- auth_redirect
- application_name
- public_key
- padding (opcional)
e com o cabeçalho User-Api-Key.
Esta solicitação redirecionará para uma tela no Discourse que pedirá ao usuário para permitir que o aplicativo acesse o site. Se o usuário aprovar, o site redirecionará de volta para a URL definida em auth_redirect e incluirá um parâmetro oneTimePassword criptografado com uma senha de uso único que o cliente pode usar para fazer login no site solicitando https://nomedosite.com/session/otp/SENHA-UNICA. (A senha de uso único é válida apenas por 10 minutos.)
Revogando chaves de API
Para revogar uma chave de API, faça uma solicitação POST com o cabeçalho User-Api-Key e sem parâmetros para /user-api-key/revoke.
Última revisão por @SaraDev em 2022-07-13T00:00:00Z
