Discourse には、非常に特定のプロトコルに従うことで、ユーザーごとに API キーを生成するシステムが含まれています。この機能により、モデレーターの介入を必要とせずに、「アプリケーション」が Discourse インスタンスにアクセスできます。
概要
大まかな流れは以下の通りです。
-
クライアント(デスクトップアプリ、ブラウザプラグイン、モバイルアプリ)が秘密鍵/公開鍵ペアとリターン URL を生成します
-
クライアントは Discourse のルートにリダイレクトし、Discourse に公開鍵を渡します
-
Discourse はユーザーからアプリの使用許可を取得します
-
Discourse がユーザー API キーを生成します
-
Discourse は、ユーザー API キーを含む公開 API キーで暗号化されたペイロードをリターン URL にリダイレクトします
詳細
使用例:
-
最終ユーザーに代わって複数の Discourse サイトの通知数を取得するために、Discourse サイトをポーリングするデスクトップアプリケーション。
-
最終ユーザーに代わって Discourse サイトをポーリングし、プッシュ通知を処理するモバイルアプリケーション。
-
最終ユーザーに対して、様々な Discourse サイトに関するダッシュボードを提供する Web アプリケーション。
-
一般的な企業アプリの一部として Discourse を消費するサードパーティ製アプリとのカスタム統合。例:Discourse コミュニティの通知を Hopscotch アプリに統合する。
設計:
サイト設定
-
allow_user_api_key_scopes:ユーザー API キーに許可されるアクセススコープ。スコープはこちらで定義されています。利用可能な組み込みスコープは、
read、write、message_bus、push、one_time_password、notifications、session_info、bookmarks_calendar、user_statusです(プラグインは追加のスコープを登録できます)。 -
user_api_key_allowed_groups:ユーザー API キーの生成を許可されるグループを制御します(デフォルトは管理者、モデレーター、および trust_level_0)。
-
allowed_user_api_push_urls:プッシュ通知の送信先となることができるサイトのリスト
-
allowed_user_api_auth_redirects:ユーザー API キー生成後の許可されたリダイレクト先
グローバル設定
- max_user_api_reqs_per_minute:50
- max_user_api_reqs_per_day:4000
UX 要素
ユーザー API キーが付与されている場合、Discourse はユーザーページにアプリタブを表示します。
アプリタブには以下がリストされます。
- アプリケーションの名前(例:「Discourse Notifier」)
- 最終使用日
- 承認日
- 付与されたアクセススコープのリスト
- キーを簡単に取り消せるアクセスを取り消すボタン
API キーの認証 UI
すべてのキーは、何が行われているかを明確に説明するページで、最終ユーザーによって明示的に承認される必要があります。例えば:
「Discourse Notifier」はあなたのアカウントに対して以下のアクセスを要求しています:
- 通知の読み取りとクリア
- ユーザーセッション情報の読み取り
- ワンタイムログイントークンの作成
[承認]
API キーの生成フロー
API は、ユーザー側で単一の GET リクエストのみを必要とします。
https://sitename.com/user-api-key/new
Discourse 2.1 以降、これらのユーザー API キーは長期間使用されない場合、自動的に期限切れになります。サイト設定
revoke user api keys unused daysはデフォルトで 180 に設定されています。
パラメータ:
- auth_redirect:生成されたトークンと共にリダイレクトする URL
- application_name:リクエストを行うアプリケーションの名前(ユーザーアカウントのアプリタブに表示されます)
- client_id:クライアントの一意の識別子
- nonce:クライアントが生成する一意の nonce。これは暗号化されたペイロード内で返されるため、クライアントはレスポンスの真正性を検証できます
- scopes:キーに許可されるアクセススコープのカンマ区切りリスト。利用可能なスコープの全リストについては
allow user api key scopesを参照 - push_url:プッシュ通知を送信する URL(
pushまたはnotificationsがスコープに含まれている場合に必須かつ有効) - public_key:クライアントが生成した鍵ペアの公開鍵部分
- padding(オプション):ペイロードの暗号化に使用する RSA パディングモード。受け入れられる値は
pkcs1(デフォルト)またはoaepです。新しいアプリケーションには OAEP を推奨します
/user-api-key/new が正しいパラメータで呼び出されると、2 つのことが起こり得ます。
- ユーザーがログインしていない場合、ログイン画面にリダイレクトされます(ログイン後、認証を再開します)
- ユーザーがログインすると、認証 UI が表示されます
認証が許可されると、システムは auth_redirect で定義された URL にリダイレクトし、生成されたユーザー API キー(key)、nonce、プッシュステータス(push)、および API バージョン(api)を含む JSON オブジェクトを保持する暗号化された payload パラメータを含めます。one_time_password スコープが要求された場合、別の暗号化された oneTimePassword クエリパラメータも含まれます。追加のセキュリティのため、client_id は返されません。
API バージョンの確認
Discourse のユーザーキー API はバージョン管理されています。クライアントは、https://sitename.com/user-api-key/new に対して HEAD リクエストを行うことで、Discourse サイトの API バージョンを確認できます。レスポンスには、サイトの API のバージョン番号を含む Auth-Api-Version という名前のヘッダーが含まれます。
API の消費
クライアント API の消費は、現在の管理者 API と多少異なります。
クライアントは 2 つのヘッダーを指定できます。
User-Api-Key(必須):生成されたキー
および
User-Api-Client-Id(オプション):データベース内のこの api_key 用に保存されている ‘client id’ を更新するためにこれを供給します。
これらのヘッダーが指定されると、クライアントは通常通り API に対してリクエストを実行できます。
ワンタイムログインパスワードの生成
バージョン 4 以降、API には特別なスコープ、すなわち one_time_password スコープが含まれており、これによりクライアントはユーザー API キーを使用してワンタイムパスワードを生成できます。上記の手順に従って API キーを生成する際にクライアントがこのスコープを含めると、暗号化された oneTimePassword がクライアントへのリダイレクト内で別のクエリパラメータとして含まれます。
または、クライアントは以下のパラメータで /user-api-key/otp に対して GET リクエストを行うことができます。
- auth_redirect
- application_name
- public_key
- padding(オプション)
および User-Api-Key ヘッダー。
このリクエストは、Discourse 内の画面にリダイレクトし、ユーザーにアプリケーションがサイトにアクセスすることを許可するよう求めます。ユーザーが承認すると、サイトは auth_redirect で定義された URL にリダイレクトし、ワンタイムパスワードを含む暗号化された oneTimePassword パラメータを含めます。クライアントは https://sitename.com/session/otp/ONE-TIME-PASSWORD をリクエストすることで、このワンタイムパスワードを使用してサイトにログインできます。(ワンタイムパスワードの有効期限は 10 分です。)
API キーの取り消し
API キーを取り消すには、User-Api-Key ヘッダーを付けた POST リクエストをパラメータなしで /user-api-key/revoke に行います。
最終レビュー:@SaraDev 2022-07-13T00:00:00Z
