Consegui fazer isso funcionar, após alguns testes e ajustes.
Aqui estão as etapas básicas que sigo quando: tenho um aplicativo separado que desenvolvi e quero que os usuários possam usá-lo para fazer chamadas de API a um site do Discourse.
Para isso, preciso gerar um token de API por usuário para fazer chamadas em nome de cada usuário específico (pelo menos em um ambiente Node.js/JavaScript).
Observe que, para a parte de JavaScript, encontrei o código fornecido por @KengoTODA aqui: discourse-api-key-generator/src/index.ts at main · KengoTODA/discourse-api-key-generator · GitHub, que foi muito útil.
Aqui estão as etapas que segui:
Primeiro: Gere um par de chaves pública e privada.
Isso é algo que seu aplicativo precisa gerar: uma chave pública e uma chave privada. O gist do GitHub fornece um método para fazer isso.
Segundo: Tenha uma URL de redirecionamento.
Esta é a URL para a qual o Discourse irá redirecionar, fornecendo o token de API final no payload. Se você tiver um aplicativo de desktop (ou seja, sem uma URL de navegador), a URL de redirecionamento será baseada em um protocolo personalizado que você configurou, que abre o aplicativo quando a URL de redirecionamento é inserida no navegador.
Observe que a URL de redirecionamento precisa estar na lista de permissões nas configurações do site do Discourse alvo.
O site do Discourse também provavelmente precisa ter a configuração do site marcada para “Permitir chaves de API do usuário”. Consulte a postagem original sobre este tópico para “Configurações do Site”.
Terceiro: Envie a chamada de solicitação de API para a URL de solicitação do Discourse.
Então, seu aplicativo enviará uma chamada para uma URL que segue este formato:
https://[seu site alvo do Discourse .com]/user-api-key-new"
e adicionando como parâmetros:
- o nome do seu aplicativo
- seu “client_id” (consegui usar hostname(), de
const {hostname} = require('os')para um aplicativo de desktop, assim como no gist do GitHub mencionado acima) - escopos (estes são os escopos que você deseja que o usuário possa realizar por meio da API, como “write”, “read”, etc.)
- sua chave pública (da etapa 1 acima)
- sua URL de redirecionamento (da etapa 2 acima)
- nonce (este é um valor que você pode escolher—usar apenas ‘1’ parece funcionar)
Quarto: O usuário autoriza seu aplicativo na página do site do Discourse aberta pela URL de solicitação.
Quando você envia a URL de solicitação com sucesso, ela abre uma página no site do Discourse informando ao usuário que seu aplicativo deseja acessar o site.
Nessa página, há um botão para o usuário permitir isso. Quando o usuário clica nesse botão, o site do Discourse redireciona para a URL de redirecionamento que você forneceu e anexa como parâmetro um ?payload=[A CHAVE DE API]. A CHAVE DE API aqui é a chave que você precisa decodificar em seu aplicativo.
Quinto: Seu aplicativo captura o valor da URL de redirecionamento (com o valor do payload) e você decodifica a CHAVE DE API.
Você está quase lá. Seu aplicativo precisa analisar a URL de redirecionamento para a qual o Discourse foi e obter a Chave de API contida no payload.
Depois de obter essa Chave de API, você precisa fazer duas coisas:
- Obter a chave real, não a versão codificada em URL: se você estiver obtendo um parâmetro de uma URL, ela geralmente está codificada em URL (adicionando % aqui e ali, etc.). Você precisa limpá-la. Em JavaScript, encontrei que
decodeURIComponentfunciona para isso. - Depois de obter a CHAVE DE API limpa retornada pelo Discourse, você precisa decodificá-la. Para isso, você pode usar a decodificação em JavaScript com chaves privadas. Basicamente, você usa sua chave privada (gerada na primeira etapa acima) para decodificar a CHAVE DE API limpa. Há algum exemplo de JavaScript no gist do GitHub que referenciei acima: discourse-api-key-generator/src/index.ts at main · KengoTODA/discourse-api-key-generator · GitHub
Depois de executar seu código de decodificação, você tem o próprio token, que agora pode usar para fazer chamadas de API autenticadas em nome do usuário.
Sexto: Use o token (ou seja, a Chave de API final, limpa e decodificada) para fazer chamadas de API em nome do usuário.
Com esse token, parece que você não precisa inserir o nome de usuário na chamada de API. Acredito que o seguinte cabeçalho seja suficiente quando incluído em suas chamadas GET, POST, PUT, etc.:
headers: {
"User-Api-Key": [o token]
}
E com isso, você espera ter um método de autenticação por usuário funcionando para interagir com o Discourse.