bamthomas
(Bruno Thomas)
1
コラボレーションツールとして Discourse を使用しており、ドキュメントを検索するための別のアプリも運用しています。ドキュメントに関するコメントを Discourse に統合したいと考えています。両方のシステムは、当社のインフラストラクチャ内で外部の SSO/OAuth プロバイダーを使用しています。
2 つのアプリを接続して通信させるために、User API Key を使用しています。機能は問題なく動作していますが、信頼された環境であり OAuth によってバックアップされているため、避けたい「アプリケーションへのアクセスを承認する」フォームをクリックする必要があります。
この「承認」ステップを回避したり、バイパスして直接 User API Key の作成に進んだりする方法はありませんか?そうすれば、このページが表示されず、ユーザーが追加のステップを実行する必要がなくなります。このステップをバイパスするためにリクエストに含められるパラメータは存在しますか?
UserApiKeysController.new の代わりに UserApiKeysController.create を最初に呼び出してみましたが、CSRF エラーが発生しました。そのため、トークンの確認をスキップする以下のような試みも行いました:
class UserApiKeysController < ApplicationController
skip_before_action :verify_authenticity_token
しかし、これも機能しませんでした。
他に良い方法をご存知でしょうか?
ご教示のほど、よろしくお願いいたします。
osioke
(Osioke Itseuwa)
2
ようこそ、Brunoさん!一緒に参加してくれて嬉しいです
これについては、@david か @blake が何かアイデアを持っているかもしれません。
「いいね!」 1
riking
(Kane York)
3
これは明らかに正しいアプローチではありません。すでにプラグインを使用されていますか、それとも HTTP 経由でのみやり取りしていますか?
プラグインを使用している場合、基本的に app/controllers/ のインスタンスと直接やり取りすべきではありません。
HTTP 経由でやり取りしており、かつサーバー間通信を行っている場合は、管理者が作成した API キーを使用する方が適切です。
User API は、クライアント側のコード整合性を保証する方法がないクライアント - サーバー間の通信を目的として設計されています。
「いいね!」 2
bamthomas
(Bruno Thomas)
4
はい、Discourse プラグインの開発を計画しており、JS アプリは HTTP リクエストとのみやり取りする予定です。
コンポーネント間の結合度を最小限に抑えるため、サーバー間通信(例:管理者 API キーの使用)を開発する必要を避けたいと考えています。
理想的には Discourse のコントローラーを直接いじるべきではないと理解しています。一方で、オーバーライドを想定して設計されているメソッド(テンプレートメソッドパターンや他の拡張ポイントなど)が多数存在し、これまでのところ多くのプラグインがそれらを利用していることも確認しています。
では、正しいアプローチは何でしょうか?
riking
(Kane York)
5
プラグインを作成する場合は、必要なタスクを直接実行するプラグインマウント型のコントローラー内で新しいルートを開発する必要があります。これらのルートはすべて、Access-Control-Allow-{Origin, Headers, Credentials} レスポンスヘッダーを設定する before_action を共有できます(アプリが動作すべきドメインのリストに Origin リクエストヘッダーが含まれている場合は、それをエコーします)。
これにより、JS コードは API キーを一切指定せずに fetch(..., { credentials: "include", ...}) を呼び出すだけで済みます。
「いいね!」 2
bamthomas
(Bruno Thomas)
6
@riking ありがとうございます。Discourse 上でオープンセッションが存在する場合、これは正常に動作します。
SiteSetting.enable_local_logins = false に設定しており、OAuth による認証メカニズムが 1 つのみ存在するため、http://discourse_site/login を直接呼び出すことで手動で新しいセッションを開始できます。ブラウザは OAuth プロバイダーにリダイレクトされた後、Discourse へリダイレクトされます。これは /user-api-key/new を呼び出した際の裏側で発生していた処理と同じです。
もし現在 Discourse のセッションが存在しない場合、アプリからどのようにして新しい Discourse セッションをプログラム的に開始すればよいでしょうか?