Usuário não administrador pode emitir sua própria chave de API?

Olá :waving_hand:,

Estou criando uma ação do GitHub para publicar no fórum Discourse.
Encontrei a API de posts, porém a documentação diz que usuários do Discourse precisam criar uma chave de API no painel de administração, mesmo que usuários não administradores não tenham acesso a um painel de administração. Aqui tenho algumas perguntas:

  • A chave de API foi projetada até para usuários não administradores?
  • Se sim, como usuários não administradores podem criar sua chave de API?
  • Se sim, para habilitar a chave de API para usuários não administradores, há alguma configuração necessária?
    • A página de preferências do fórum não tem interface para criar uma chave de API. Então imagino que existam algumas configurações que permitam aos usuários emitir suas próprias chaves de API.

Obrigado antecipadamente! :folded_hands:

1 curtida

Olá @KengoTODA, bem-vindo! :slight_smile: :wave:

User API keys specification será útil para o que você descreveu.

3 curtidas

Obrigado! Verifiquei a parte do ‘fluxo de geração de chave de API’.

Entendi que é para aplicações web que podem fornecer uma URL de auth_redirect.
Existe alguma maneira recomendada para CLI ou GitHub Actions?

Se isso for para uma GitHub Action, provavelmente será melhor criar uma chave de API escopada, que permita apenas as ações necessárias, mas, sim, você precisará ser um administrador para criar essa chave.

4 curtidas

Para programas de CLI, se isso for necessário, você pode iniciar um servidor web local e usar uma URL http://localhost:XXXXX/callback. O aplicativo faz algo semelhante.

3 curtidas

Ok, vou tentar, obrigado pelo apoio!

1 curtida

Você pode criar uma API de usuário seguindo Generate User API Keys for testing

2 curtidas

Estou trabalhando nesta branch (GitHub - KengoTODA/sonar-update-center-action at 54212084e9ec8ab2c364ec5e96bf1fac7301a557 · GitHub) e executei o comando com sucesso usando localhost como URL de redirecionamento. No entanto, após clicar no botão para autorizar, a página https://meta.discourse.org/user-api-key relatou um erro de JS e não pôde prosseguir com a operação. O script ruby funciona, mas também falha quando adiciono o parâmetro auth_redirect.

Aqui está a exceção relatada no console do navegador:

Uncaught TypeError: Cannot set property 'isReadOnly' of undefined
    at Function.createCurrent (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:44867)
    at Function.current (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:8816)
    at Object.initialize (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:70403)
    at Object.i.initialize (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:7001)
    at _ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:49660
    at i.each (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67904)
    at i.walk (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67891)
    at n.each (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67858)
    at n.topsort (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67758)
    at t._runInitializer (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:49667)

Vou anexar a captura de tela da análise do código JS. Parece que o siteAttributes é esperado como um valor válido, mas está undefined. Se você tiver alguma sugestão para mim, por favor, me avise. Obrigado!

Estou investigando este problema.

O JS lança um erro porque o método POST para /user-api-key retorna 403 e o método build_not_found_page no controlador não invoca o método preload_anonymous_data, que armazena o valor pré-carregado.

Não está claro por que o servidor respondeu com 403 e <h1 class="title">Oops! That page is private.</h1> quando adicionei o parâmetro auth_redirect. Tentei usar o mesmo domínio para a URL de callback (para verificar um problema de cross-site scripting) e o protocolo HTTPS, mas sem sucesso.

Você precisa adicionar o domínio (e o caminho) à configuração do site allowed user api auth redirects.

Se você estiver fazendo solicitações HTTP manualmente, então discourse://auth_redirect deve funcionar.

3 curtidas

Obrigado, encontrei a configuração em site_settings.yml e entendi por que minha solicitação retornou 403.

O discourse://auth_redirect não está funcionando como esperado para mim, então vou tentar pedir aos usuários que insiram manualmente o token criptografado, assim como no código Ruby.

Nota para outros usuários: Criei um módulo Node que pode ser invocado via o comando npx. Ele criará uma chave de API com escopo write. Espero que isso ajude no processo de configuração de sistemas que precisam de um token da API do Discourse.

2 curtidas

Edição: Olá @KengoTODA. Seu código no GitHub foi útil para me indicar o caminho certo. Ainda estou resolvendo alguns detalhes, mas em breve escreverei um resumo de como consegui fazer tudo funcionar.

O código do GitHub de @KengoTODA me ajudou muito. Agora tenho uma versão funcional de autenticação de usuários por usuário para fazer chamadas de API ao Discourse. Descrevi meus passos aqui: User API keys specification - #45 by JQ331

2 curtidas