O Discourse contém um sistema para gerar chaves de API por usuário se um protocolo muito específico for seguido. Este recurso facilita o acesso de “aplicativos” às instâncias do Discourse sem a necessidade de envolver moderadores.
Descrição de alto nível
Em alto nível:
- O cliente (aplicativo de desktop, plugin 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 ao Discourse sua chave pública
- O Discourse obtém a aprovação do usuário para usar o aplicativo
- O Discourse gera uma chave de API de usuário
- O Discourse redireciona de volta para a URL de retorno com um payload criptografado usando a chave pública contendo a chave de API do usuário
Detalhes
Casos de uso:
- Aplicativos de desktop que consultam sites do Discourse em nome de usuários finais para obter contagens de notificações em vários sites.
- Aplicativos móveis que consultam sites do Discourse em nome de 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(plugins podem registrar escopos adicionais). -
user_api_key_allowed_groups: controla quais grupos estão autorizados a gerar chaves de API de usuário (o padrão é administradores, moderadores e nível_de_confiança_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 do usuário
Configurações Globais
- max_user_api_reqs_per_minute: 20
- max_user_api_reqs_per_day: 2880
Elementos de UX
Se alguma chave de API de usuário tiver sido concedida, o Discourse exibe uma aba apps (aplicativos) na página do usuário.
A aba apps (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 revoke access (revogar acesso) para que você possa revogar facilmente quaisquer chaves
UI de autorização da chave de API
Cada chave terá que ser explicitamente autorizada pelos usuários finais em uma página que explica 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://sitename.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 daysé 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. Ele será repetido no payload criptografado 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 somente 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 o payload. Valores aceitos são
pkcs1(padrão) ouoaep. OAEP é recomendado para novos aplicativos.
Após /user-api-key/new ser chamado com os parâmetros corretos, 2 coisas podem acontecer
- Se o usuário não estiver logado, seremos redirecionados para o login (após o login, retomaremos a autorização)
- Assim que um usuário estiver logado, ele verá a UI 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 do usuário gerada (key), o nonce, o status 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. client_id não é repetido 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://sitename.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
O consumo da 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 api_key no banco de dados.
Assim que esses cabeçalhos forem especificados, o cliente poderá realizar solicitações contra a API normalmente.
Gerando uma senha de login única
A partir da versão 4, a API inclui um escopo especial: o escopo one_time_password, que permite aos clientes usar a chave de API do usuário para gerar uma senha de uso único (one-time-password). Se o cliente incluir este escopo ao gerar a chave de API seguindo as etapas acima, uma oneTimePassword criptografada será incluída 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://sitename.com/session/otp/ONE-TIME-PASSWORD. (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 nenhum parâmetro para /user-api-key/revoke.
Última Revisão por @SaraDev em 2022-07-13T00:00:00Z

