非管理者ユーザーは独自のAPIキーを発行できますか?

こんにちは :waving_hand:

GitHub アクションを使って Discourse フォーラムに投稿する処理を作成しています。
投稿 API は見つかったのですが、ドキュメントには「Discourse ユーザーは管理パネルから API キーを作成する必要がある」と記載されています(Discourse API Docs

  • API キーは非管理者ユーザー向けにも設計されているのでしょうか?
  • もしそうなら、非管理者ユーザーはどのようにして自分の API キーを作成できるのでしょうか?
  • もしそうなら、非管理者ユーザー向けに API キーを有効にするために必要な設定はありますか?
    • フォーラムの設定ページには API キーを作成するインターフェースがありません。そのため、ユーザーが自分の API キーを発行できるようにする何らかの設定があるのではないかと推測しています。

よろしくお願いいたします!:folded_hands:

「いいね!」 1

こんにちは @KengoTODA さん、ようこそ! :slight_smile: :wave:

ご質問の件には、以下のリンクが役立つでしょう。

「いいね!」 3

ありがとうございます!「API キー生成フロー」の部分は確認しました。

これは auth_redirect URL を提供できる Web アプリケーション向けであると理解しました。
CLI や GitHub Actions には、推奨される方法などはありますか?

GitHub Action 用の場合は、必要な操作のみを許可するスコープ付き API キーを作成する方が良いでしょう。ただし、このキーを作成するには管理者権限が必要です。

「いいね!」 4

CLI プログラムの場合、必要であればローカル Web サーバーを起動し、http://localhost:XXXXX/callback のような URL を使用できます。このアプリも同様の処理を行います。

「いいね!」 3

わかりました、やってみますね!サポートありがとうございます!

「いいね!」 1

ユーザー API を作成するには、Generate User API Keys for testing を参照してください。

「いいね!」 2

https://github.com/KengoTODA/sonar-update-center-action/tree/54212084e9ec8ab2c364ec5e96bf1fac7301a557で作業中で、リダイレクト URL として localhost を使用してコマンドを正常に実行できました。しかし、承認ボタンをクリックした後、https://meta.discourse.org/user-api-key のページで JS エラーが発生し、処理を継続できませんでした。Ruby スクリプトは動作しますが、auth_redirect パラメータを追加するとこれも失敗します。

ブラウザのコンソールで報告された例外は以下の通りです:

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)

JS コードの分析からのスクリーンショットを添付します。siteAttributes が適切な値であることが期待されていますが、実際には undefined のようです。何かご提案があれば、お知らせください。よろしくお願いいたします!

この問題について調査中です。

JS がエラーをスローするのは、/user-api-key に対する POST メソッドが 403 を返しているためです。また、コントローラー内の build_not_found_page メソッド が、事前読み込みされた値を保存する preload_anonymous_data メソッドを呼び出していないことが原因です。

auth_redirect パラメータを追加した際に、サーバーが <h1 class="title">Oops! That page is private.</h1> というレスポンスで 403 を返した理由については確信が持てません。クロスサイトスクリプティングの問題を検証するために、コールバック URL に同じドメインを使用し、HTTPS プロトコルも試しましたが、解決しませんでした。

allowed user api auth redirects サイト設定にドメイン(およびパス)を追加する必要があります。

手動で HTTP リクエストを発行している場合は、discourse://auth_redirect が機能するはずです。

「いいね!」 3

ありがとうございます。site_settings.yml の設定が見つかり、私のリクエストが 403 エラーになった理由がわかりました。

discourse://auth_redirect が期待通りに動作しないため、Ruby のコードのように、ユーザーに暗号化されたトークンを手動で入力してもらうようにします。

他のユーザーへのメモ:私は npx コマンドで呼び出せる Node モジュールを作成しました。これにより、write スコープを持つ API キーが生成されます。Discourse API トークンが必要なシステムのセットアッププロセスの助けになれば幸いです。

「いいね!」 2

追記:こんにちは、@KengoTODA さん。GitHub のコードが方向性を示すのに役立ちました。いくつかの点を整理中ですが、その後、どのように動作させたかについて少しまとめます。

@KengoTODA さんの GitHub コードは大変参考になりました。Discourse への API 呼び出しをユーザーごとに認証する、動作するバージョンが完成しました。手順はここにまとめました: User API keys specification - #45 by JQ331

「いいね!」 2