KengoTODA
(Kengo TODA)
2020 年 12 月 14 日午前 9:31
1
こんにちは
GitHub アクションを使って Discourse フォーラムに投稿する処理を作成しています。
投稿 API は見つかったのですが、ドキュメントには「Discourse ユーザーは管理パネルから API キーを作成する必要がある」と記載されています(Discourse API Docs
API キーは非管理者ユーザー向けにも設計されているのでしょうか?
もしそうなら、非管理者ユーザーはどのようにして自分の API キーを作成できるのでしょうか?
もしそうなら、非管理者ユーザー向けに API キーを有効にするために必要な設定はありますか?
フォーラムの設定ページには API キーを作成するインターフェースがありません。そのため、ユーザーが自分の API キーを発行できるようにする何らかの設定があるのではないかと推測しています。
よろしくお願いいたします!
osioke
(Osioke Itseuwa)
2020 年 12 月 14 日午前 10:14
2
こんにちは @KengoTODA さん、ようこそ!
ご質問の件には、以下のリンクが役立つでしょう。
Discourse contains a system for generating API keys per user if a very specific protocol is followed. This feature facilitates “application” access to Discourse instances without needing to involve moderators.
High level description
At a high level:
Client (desktop app, browser plugin, mobile app) generates a private/public key pair and return url
Client redirects to a route on discourse giving discourse its public key
Discourse gets approval from user to use app
Discourse generat…
KengoTODA
(Kengo TODA)
2020 年 12 月 14 日午後 12:35
3
ありがとうございます!「API キー生成フロー」の部分は確認しました。
これは auth_redirect URL を提供できる Web アプリケーション向けであると理解しました。
CLI や GitHub Actions には、推奨される方法などはありますか?
blake
(Blake Erickson)
2020 年 12 月 14 日午後 6:03
4
GitHub Action 用の場合は、必要な操作のみを許可するスコープ付き API キーを作成する方が良いでしょう。ただし、このキーを作成するには管理者権限が必要です。
riking
(Kane York)
2020 年 12 月 14 日午後 8:53
5
CLI プログラムの場合、必要であればローカル Web サーバーを起動し、http://localhost:XXXXX/callback のような URL を使用できます。このアプリも同様の処理を行います。
KengoTODA
(Kengo TODA)
2020 年 12 月 14 日午後 9:11
6
わかりました、やってみますね!サポートありがとうございます!
Falco
(Falco)
2020 年 12 月 14 日午後 9:25
7
KengoTODA
(Kengo TODA)
2020 年 12 月 15 日午前 1:12
8
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 のようです。何かご提案があれば、お知らせください。よろしくお願いいたします!
KengoTODA
(Kengo TODA)
2020 年 12 月 18 日午前 10:20
9
この問題について調査中です。
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 プロトコルも試しましたが、解決しませんでした。
riking
(Kane York)
2020 年 12 月 18 日午後 11:41
10
allowed user api auth redirects サイト設定にドメイン(およびパス)を追加する必要があります。
手動で HTTP リクエストを発行している場合は、discourse://auth_redirect が機能するはずです。
KengoTODA
(Kengo TODA)
2020 年 12 月 20 日午前 11:30
11
ありがとうございます。site_settings.yml の設定 が見つかり、私のリクエストが 403 エラーになった理由がわかりました。
discourse://auth_redirect が期待通りに動作しないため、Ruby のコード のように、ユーザーに暗号化されたトークンを手動で入力してもらうようにします。
KengoTODA
(Kengo TODA)
2020 年 12 月 20 日午後 1:39
12
他のユーザーへのメモ:私は npx コマンドで呼び出せる Node モジュールを作成しました。これにより、write スコープを持つ API キーが生成されます。Discourse API トークンが必要なシステムのセットアッププロセスの助けになれば幸いです。
A tool which generates API key for Discourse
JQ331
2021 年 7 月 29 日午前 11:47
13
追記:こんにちは、@KengoTODA さん。GitHub のコードが方向性を示すのに役立ちました。いくつかの点を整理中ですが、その後、どのように動作させたかについて少しまとめます。
JQ331
2021 年 9 月 2 日午後 4:27
14
@KengoTODA さんの GitHub コードは大変参考になりました。Discourse への API 呼び出しをユーザーごとに認証する、動作するバージョンが完成しました。手順はここにまとめました: User API keys specification - #45 by JQ331