SPAでDiscourseユーザーと連携する

SPAでDiscourseからユーザー固有のデータを取得する方法を探しています。

大まかな設定
SPAはmy-app.comで実行
Discourseはcommunity.my-app.comで実行

SPAには独自のユーザー管理はありません。Discourseをユーザー管理に使用したいと考えています(他に独自のユーザー管理を必要とするユーザー固有のものがないため)。

しかし、SPAで現在ログインしているDiscourseユーザーを表示したり、たとえば未読トピックのウィジェット(ユーザー固有のもの)を表示したりしたいと考えています。そのため、API経由でDiscourseからデータをロードする必要があります。

試したこと:

  • Discourse SSOパスを使用し、その後SPAにリダイレクトします。これは問題ありません。現在のユーザーのメールアドレス、外部IDなどを取得できますが、リクエストに使用できるもの(トークン/キー)はありません。
  • DiscourseCookieを使用してリクエストを行えるようにCookie設定を調整しました(成功せず)。
  • User API keys specification でユーザーAPIキーについて読みましたが、ユーザーが同じサイトであるアプリにDiscourseアカウントへのアクセスを許可することには違和感があります。

希望する動作を実現する方法はありますか?

よろしくお願いいたします。
Marcel

「いいね!」 1

これで機能しますか?

  1. DiscourseConnect(「Discourse SSO」)を使用して、現在のユーザーのユーザー名を取得します。
  2. 必要なスコープと「全ユーザー」アクセス権を持つAPIキーを作成します。
  3. 当然、そのキーをクライアント側のWebアプリに渡すとサイトが危険にさらされるため、Webアプリからアプリのバックエンドを経由してDiscourseインスタンスにリクエストをプロキシする必要があります。(バックエンドでユーザー名が正当であることを検証する必要もあります。DiscourseConnectを確認していませんが、おそらくその方法があるはずです。)

(追伸:例として使用するドメインには「example.com」を使用することをお勧めします。リンクされたドメインを誰かが購入してスパムやマルウェアなどを設定する可能性がありますが、example.[com|org|net] は公式に予約済みです。)

「いいね!」 1

はい、それが実際に私が以前実装していた方法です。

ユーザーをSSO経由で送信すると、ミドルウェアは名前、メールアドレス、トークン配列を持つシンプルなユーザーを作成し、トークンを作成してSPAに返します。

ミドルウェアは、すべてのユーザーAPIキーを使用してDiscourseへのリクエストをプロキシし、「セッショントークン」(どのユーザーかを確認するため)やその他のセキュリティマジックを検証します。

ユーザーがログインしたままにするために、Cookie /ローカルストレージを使用し、Discourseのログアウト直接オプションを介してログアウトを同期します。

これは機能しますが、管理者APIトークンとユーザー名を組み合わせて処理するよりも良い方法があると思います。管理者が誰かのユーザー名を変更すると、それが壊れます…ハッシュIDのようなものが欲しいのですが…しかし、私が変更できるものではないので、これで我慢します :wink:

回答ありがとうございました。

「いいね!」 2