Google認証エラー

こんにちは、

Discourse は初心者です。最近フォーラムを作成し、サイトとフォーラムを新しいドメイン名に移行する作業中です。

フォーラムの旧ドメイン: https://forum.skymail.app(非アクティブ、新しいサイトへリダイレクト)

新しいドメイン: https://forum.sugarmail.app(稼働中)

Google 認証に問題が発生しています。Google Cloud プロジェクトを持っており、ドメインを切り替えた後、Client ID のリダイレクト URL も変更しました。現在は以下のように設定されています。

https://forum.sugarmail.app/auth/google_oauth2/callback

ここで問題です。「Google でサインアップ」を試みると、Discourse で以下のエラーが表示されます。

https://forum.sugarmail.app/auth/failure?message=csrf_detected Authorization timed out, or you have switched browsers. Please try again.

フォーラムが旧ドメイン forum.skymail.app にある間は、Google 認証は問題なく動作していました。

ドメイン変更後、./launcher rebuild app を実行し、app.yaml の DISCOURSE_HOSTNAME でドメインを更新することを確認しました(実際、この操作を行うまでフォーラムは全く読み込めませんでした)。

何か手がかりがあれば教えていただけますか?

通常、ログインフローを開始すると、ブラウザに _forum_session クッキーが設定されます。しかし、あなたのサイトではそれが行われていないようです。

あなたのサイトでクッキーに干渉している可能性のあるプラグインやプロキシはありますか?

ご返信ありがとうございます。

プラグイン - いいえ、使用していません。インストール後にやったことといえば、Google 認証(クライアント ID とシークレット)の有効化と、「常に HTTPS を使用する」のオンにすることだけです。

プロキシ - メインのアプリサイトも提供しているリバースプロキシとして nginx を使用しています。

    # discourse
    location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass_request_headers on;
            proxy_pass http://localhost:10080;
    }

containers/app.yaml 内では以下の通りです。

expose:
  - "10080:80"   # http
  - "10443:443" # https

Discourse の設定で Let’s Encrypt は有効になっていません。そのため、コンテナ内の nginx は平文の HTTP で提供し、外部の nginx が SSL 終端を担当しています。

これは以前のドメインで使っていた設定とほぼ同じで、違いは「HTTPS 強制」だけです。

バージョンは 2.6.0.beta3 を実行しています。

ああ、ダメですね。以前オフにしていた「Force HTTPS」が原因でした。

最近これを有効にしたのは、画像への平文の http リンクが原因で Chrome で「ページコンテンツが安全でない」という警告が表示されるのを防ぐためです。

繰り返しになりますが、私は外部の nginx で SSL 終端を行っており、Discourse 自体には SSL は設定されていません。

「Force HTTPS」を無効にすると、Google 認証が再び機能するようになりました(Google Cloud プロジェクトに平文の http リンクをリダイレクト先として追加する必要がありました)。

しかし、画像が表示されるとすぐに「安全でないサイト」や「混合コンテンツ」の警告が出てしまうため、これは望ましくありません。

「Force HTTPS」を有効にしたまま、かつ Discourse の外部で SSL 終端を行っている状況でも、Google 認証を動作させる方法はないでしょうか?

(Discourse 自体の SSL サポートを使うことも考えましたが、これはドメインを「所有」していると仮定しているため、この VPS に追加の IP アドレスを設定し、メインサイトとフォーラムを分離する必要があります… これは少し手間がかかります…)

X-Forwarded-Proto: https を送信していることを確認してください。

@riking さん、ありがとうございます。リンク先の nginx ブロックをそのままコピーし、Discourse 管理コンソールの推奨通り「強制 HTTPS」を有効にしました。

これでフォーラムは復旧し、Google 認証も動作しています。

ただ、まだ一つ問題が残っています。

Chrome と Firefox の両方で「安全でないページコンテンツ」の警告が表示されます。

Chrome の開発者ツールでネットワーク追跡を確認すると、以下のリンク(HTTPS ではなく平文の HTTP)が原因のようです。

http://forum.sugarmail.app/uploads/default/optimized/1X/_129430568242d1b7f853bb13ebea28b3f6af4e7_2_512x512.png

ああ、気にしないでください。新しいカスタムファビコンを設定したら、HTTPS で取得されるようになりました。「混合コンテンツ」の警告も出なくなりました。

素晴らしいです。お手伝いいただきありがとうございます!