Especificação das chaves de API de usuário

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:

  1. 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 decodeURIComponent funciona para isso.
  2. 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.

7 curtidas