jessicat
(Jessica Coates)
2019 年 12 月 5 日午後 2:19
1
こんにちは、
イントラネットサイトに Discourse を埋め込む際に問題が発生しています。
API ドキュメントによると、Discourse へのリクエストでは認証とフィードへのアクセス取得のためにヘッダー「API-Key」と「Api-Username」が必要と記載されています。しかし、プリフライトチェックでは「User-API-Key」と「User-Api-Client-Id」が許可された値として示されています。
ブラウザ経由ではない呼び出しでは期待通りに動作しますが、ブラウザ経由で呼び出すと、サーバーは「User-API-Key」と「User-Api-Client-Id」が必要だと主張します。
PostMan で基本的な接続が動作するか確認したところ、Discourse のドキュメント通り動作しました。
ドキュメントに記載されているヘッダーを渡すと、ブラウザがプリフライトチェックによりリクエストをブロックし、Access-Control-Allow-Headers の CORS エラーが発生します。
サーバーが受け入れるヘッダーを渡すと、アプリケーションが異なる名前の値を期待しているため「認証エラー」が発生します。
Docker 設定にヘッダーを追加してみましたが、適用されていないようです。CORS は有効化されており、設定にオリジン「*」が含まれています。
ご助言いただけますでしょうか?
よろしくお願いいたします、
ジェシカ
jessicat
(Jessica Coates)
2020 年 1 月 23 日午前 9:34
2
上記について、さらに情報があれば教えていただけますか?これはバグでしょうか、それとも私のやり方に問題があるのでしょうか?
よろしくお願いいたします、
ジェシカ
david
(David Taylor)
2020 年 1 月 23 日午後 12:42
3
2 つの異なる API 認証システムがあり、混乱を招く可能性があります。
jessicat:
「API-Key」と「Api-Username」
これらは docs.discourse.org で説明されている「admin API」用のものです。これは JavaScript クライアントからの使用を想定していません。
これらは「User API」仕様に基づくもので、JavaScript クライアントから使用可能です(したがって CORS をサポートしています)。詳細については、こちらをご覧ください: User API keys specification
@david SSO を使用しており、アプリからログアウトした際に Discourse からもユーザーをログアウトさせたいと考えています。現在は /users/by-external/${id}.json を通じてユーザー ID を取得するために「管理 API」を使用していますが、CORS エラーが発生しています。このログアウト処理のために全ユーザー向けに「ユーザー API」を有効にしたくありません。どのような解決策を提案されますか?
david
(David Taylor)
2020 年 7 月 4 日午後 3:54
5
管理APIリクエストを送信しているのは何ですか?クライアントアプリケーション内のJavaScriptですか?
JavaScriptクライアントに管理APIを含めるべきではありません。それでは、クライアントを利用する誰もがあなたのサイトに管理者アクセスを得てしまうことになります。
はい、私のアプリでは JavaScript を使用しています。理解しました。では、代替案は何でしょうか?特定のユーザー向けの「ユーザー API」を追加し、それを介してすべてのユーザーに対して呼び出しを行うことは可能でしょうか?
david
(David Taylor)
2020 年 7 月 4 日午後 10:12
7
ユーザー API を使用する場合は、ユーザーごとに処理する必要があります。キーの共有は避けてください。
ただし、最も一般的な対応は、アプリのサーバー側で処理を行うことです。サーバーは、CORS の問題なく、セキュリティ上の懸念も少ない(安全に実装されている限り)管理者 API キーを使用してリクエストを送信できます。
@david さん、ありがとうございます。それが参考になりましたので、そのように対応します。再度お礼申し上げます。
こんにちは @david さん、バックエンドの解決策を実装しようと試みましたが、https://example.com/users/by-external/{EXTERNAL_USER_ID}.json?api_key={DISCOURSE_API_KEY}&api_username=system を呼び出すと、サインインページの HTML が返ってきます(おそらくそこへリダイレクトされているのだと思います)。ログインが必要 が有効になっている状態でこれを無効にすると、正しい JSON 応答が得られます。この設定は有効のままにしたいのですが、何が起きているか見当がつくでしょうか?
david
(David Taylor)
2020 年 7 月 5 日午後 9:58
10
API キーとユーザー名にはヘッダーを使用する必要があります。詳細は http://docs.discourse.org/ をご確認ください。