こんにちは、
背景
Discourse API と SSO をプロバイダーとして使用するアプリを作成しました。
現在、アプリは iframe 内で表示されているため、ソーシャルログインが正しく機能するには、/login ページを iframe 外で新しいブラウザタブで開く必要があります。
ここまでは問題ありません。
問題点
新しいユーザーがソーシャルボタンを使用して登録すると、ソーシャルサイトへ正常にリダイレクトされますが、Discourse へ戻った際に問題が発生します。Discourse は、ユーザー名/メールが記入されたモーダルの代わりに、通常のログインモーダルを表示してしまいます。
登録を完了するには、このログインモーダルを閉じ、手動でサインアップボタンをクリックする必要があります。
既存ユーザーのログインは期待通りに動作します。
何か見落としているのでしょうか、それとも Discourse が適切に処理していないコンテキストがあるのでしょうか?技術的には同じはずです。
デモをご覧になりたい場合はお知らせください。PM で短い動画をお送りできます(個人情報が含まれます)。
ご支援をよろしくお願いいたします。
Discourse の最新バージョンをお使いですか?
はい(ヘブライ語のテキストで申し訳ありません。ヘブライ語を利用しているクライアントのために作業しています)
この件について、ご助力いただけますでしょうか?
より正確に申し上げますと、このアプリは Chrome 拡張機能内で使用されています。現時点では iframe を使用せざるを得ない状況です。しかし、ブラウザ内で iframe から /login または /signup に新しいタブをプログラムで開く場合と、手動でタブを開いてログイン/サインアップボタンをクリックする場合の違いが、いまだにわかりません。
これは Discourse 側で修正できる問題でしょうか?
現在、Discourse を SSO プロバイダーとして使用しています。他に方法はあるでしょうか?
もしある場合、このコンテキストでログイン/サインアップを実現するための最善の方法は何でしょうか?
david
(David Taylor)
5
これをどのように実装しましたか?どこかでクッキーやセッションが失われているように聞こえます。
一般的に、Discourse を iframe 内で使用することはサポートしていません。ご指摘の通り、問題を引き起こす奇妙な癖が存在します。
私は Discourse を iframe に埋め込んでいるわけではありません。API を使用してトピックのメッセージを表示しています。
ソーシャルサイトは iframe 内での表示を許可していないため、iframe 内でログイン/サインアップを試みることはしていません。そのため、iframe 内のボタンがクリックされると、Discourse の /login ページを新しいブラウザタブで開きます。
技術的には、ユーザーがログインボタンを押すと、/session/sso_provider を含む新しいタブが開かれます。return_sso_url には、データを処理し、ユーザーのセッション情報を保存した後、ウィンドウを自動で閉じるための HTML を返すバックエンドへの URL が含まれます。その後、アプリはこの処理が完了したことを検知し、保存されたユーザーのセッションを利用できるよう自動的にリロードされます。
アプリが iframe 内にない場合でも、同様のことが起こる可能性が高いです。これはブラウザ拡張機能であるため、いずれにせよ新しいタブを開く必要があります。この場合、ログイン/サインアップのより良い方法があるのではないかと疑問に思っています。
編集:ここにデモがあります(公開する意図はありませんでしたが、問題を最も短く示す方法であり、十分に説明できていないと感じたため):
削除済み、動画は削除されました、誰も気にしないでしょう
編集2:どうやら API /session/sso_provider を使用している場合にのみ発生するようです。Discourse の URL を直接開く場合(それでも iframe 内からですが)、問題は発生しないようです。