2つのDiscourse APIシステムの目的

Discourse API 認証システムの 2 つが、いつ、どのような目的で機能するのかを明確にしたいと考えています。

こちら より)。これが私の現在の理解です:


管理 API(JSON API とも呼ばれることがあります)は、Discourse フォーラムと対話するために API 呼び出しを行う際に使用できます。ただし、以下のいずれかの条件を満たす必要があります:

  1. その呼び出しに認証が不要である、または
  2. その呼び出しに認証が必要だが、Discourse フォーラム自体も直接制御できるため、フォーラムや別アプリが API 呼び出しを行うために使用できる API キーを手動で生成できる。

一方、ユーザー API は、Discourse フォーラム(または複数のフォーラム)と対話したいが、その対話には認証が必要であり、かつ対話対象のフォーラムを制御していない場合に使用されます。

別の言い方をすれば、管理 API は「対話するフォーラムを制御している」場合向け、ユーザー API は「対話するフォーラムを制御していない」場合向けです。

これは正しいでしょうか?

例えば、@davidこちらの説明では、管理 API は JavaScript クライアントでの使用を想定していないとされています。しかし、JavaScript クライアントを使用するアプリの所有者がフォーラムも制御している限り、管理 API を JavaScript クライアントで使用しても問題ないと考えています。(つまり、別アプリの所有者とフォーラムの所有者が同一である場合です。)合っていますか?

私はそれが仕組みだと考えています。別アプリから Discourse サイトに関する管理 API への呼び出しを行いたい場合、バックエンド(サーバー側)から呼び出すことができます。バックエンドからではなくクライアント側から呼び出す場合、CORS の制限に直面する可能性があります。その場合は、管理画面の admin/site_settings/security/ → “cors origins” で別アプリのドメインをホワイトリストに登録できます。

以下に、これらの API の仕組みに関する詳細をまとめました。まだ疑問に思っている点があります:管理 API の API キーを設定する際、「全ユーザー」をユーザーレベルとして設定するのは、どのような場合に適切なのでしょうか?

詳細情報:

管理 API

基本

これは docs.discourse.org で説明されている API です。JSON API とも呼ばれます。

この API のエンドポイントと対話することで、こちらで説明されている方法を用いて、Discourse サイト上で直接行えることのほぼすべてを実行できます。

特定のエンドポイントには認証が必要です。例えば、特定のグループの詳細を取得するために API を使用したい場合(エンドポイント:[your-forum]/groups/[group-name].json)、そのグループがメンバーにのみ表示される場合、そのメンバーの一人に「代理」して呼び出しを行う必要があります。

適切な認証を用いて API 呼び出しを行うには、[your-forum]/admin/api → New API Key で API キーを生成し、そのキーのユーザーレベルとして「単一ユーザー」を選択し、リソース(例えばグループ情報)を表示する権限を持つユーザーを選択する必要があります。

その後、API 呼び出しを行う際に、ヘッダーとして Api-Key にキーを、Api-Username にそのユーザーのユーザー名を含めます。

API キーを設定する際、「全ユーザー」を選択するオプションもあります。上記の質問に関連して、この設定が、単一のユーザー(例えば管理者)を選択する場合と比べて、どのような場合に適切なのかは確信が持てません。

使用时机

管理 API は、Discourse アプリ「内」から使用できます。つまり、管理 API と対話することは可能です:(i) [your-forum]/admin/customize 下の各テーマの CSS/HTML 編集ダッシュボードから、(ii) Discourse サイトに統合したテーマから、(iii) Discourse サイトに統合したプラグインから。

また、Discourse フォーラムを制御している場合、別アプリが使用する API キーをフォーラムを通じて手動で生成できるため、別アプリから管理 API を使用することも可能です。

上記の質問に関連して、これが確認したい理解です。

ユーザー API

この API の詳細については、こちらで説明されています:User API keys specification

ユーザー API が存在するのは、管理 API が、フォーラムとは別の「あらゆる」サイトやアプリがアクセスできる汎用 API として使用されることを想定していないためだと考えています。

明確にしておくと、別アプリが Discourse フォーラムと対話するシナリオは以下の 2 つがあります:

シナリオ 1:直接的な接続なし:Discourse フォーラムと何のつながりもない開発者が、フォーラムと対話するアプリを作成します。例えば、フォーラムの管理者でも、管理者と何らかのつながりもない開発者が、さまざまな Discourse サイトをポーリングして、それらに関する事実や情報を取得するアプリを作成する場合です。

このシナリオでは、Discourse フォーラムの管理者は、無関係な開発者に API キーを手動で生成して配布することはありません。したがって、管理 API は適切ではありません。

そのため、YouTube のように、第三者の開発者が作成したアプリを通じて YouTube と対話するために使用できる API を多くのサイトが持っているのと同様に、Discourse ユーザー API は、第三者のアプリがフォーラムと対話するための手段です。具体的には、アプリを使用するクライアント(デスクトップ、携帯電話など)が、フォーラムへの限定的なアクセス権を与える API キーを生成します。

シナリオ 2:直接接続されたアプリ:フォーラムの管理者(または管理者とつながりがある開発者)が、フォーラムと対話したい別アプリと接続しています。

例えば、管理者が、Discourse 以外の機能を持つ別アプリを用意し、そのアプリのユーザーとフォーラムのユーザーに重複させたい場合です。この場合、管理者は実際に直接(フォーラムの管理ダッシュボードを通じて手動で)API キーを生成し、それを別アプリに提供して使用させることで、別アプリが管理 API を利用できるようにします。

API キーをアプリケーションに同梱すると、ハッカーがアプリケーションのバイナリやワイヤープロトコルからそのキーを簡単に抜き取ってしまいます。

ユーザー API はこの問題の影響を受けません。ユーザーがアプリケーションを承認すると、専用の API キーが生成されます。

Admin API の主なユースケースは何でしょうか?

私の場合、以下のように使用しています:

  1. API 呼び出しを行ってデータを取得し、それをフォーラムに表示することで、フォーラムに情報を追加しています。別の方法としては、プラグインを通じて Ember や Rails のコードを追加し、さまざまな種類のデータを生成して表示するというアプローチがあります。しかし、プログラミングの観点から言えば、Discourse のコードベースを完全に理解し、Ember や Rails に習熟するよりも、API の仕組みを理解して JavaScript で操作する方がはるかに簡単であるため、現時点では API を使用しています。
  2. 別々のアプリケーションがフォーラムと連携できるようにしています。

どちらの場合も、取得して表示する必要があるデータが特定のユーザーに限定されないため、ユーザー API は機能しません。API キーをフロントエンドに露出させたくないというご指摘は理解しています。この問題を解決しつつ Admin API を使用するために、キーをバックエンドに保存し、フォーラムからはそのバックエンドのエンドポイントに対して呼び出しを行っています。つまり、フォーラムから公開するのはバックエンドの URL であり(これは問題ありません)、そこに保存されている API キーそのものではありません。

ユーザー API はこのために設計されました。参考実装として、Discourse Hub のソースコードをご覧ください。

管理APIはどのような目的で設計されていますか?

管理 API はサーバー間通信用であり、例えばウェブサイトのバックエンドから行われる呼び出しなどに使用されます。