APIを使用してDiscourse Appleログインを実装する

こんにちは。Apple を使用した Discourse ログイン用の API を構築しています。プラグインはすでにインストールしており、Discourse Apple Authentication の指示に従いました。ウェブで Discourse に Apple アカウントを使用してログインする際には問題なく動作します。

ウェブからの Apple ログインのフローを確認したところ、ログインのために Apple のページにリダイレクトされ、ログインが成功すると Apple から生成されたコードを取得し、その後以下にリダイレクトされることに気づきました。

POST {{discourse_host}}/auth/apple/callback パラメータ state:{state}, code:{code from Apple} を付けて

その後、{{discourse_host}}/auth/apple/callback?code={{code from Apple}}&state={state} への GET リクエストにリダイレクトされ、Discourse API で使用される新しい Cookie が生成されます。

このフローから、/auth/apple/callback の呼び出し後に新しい Cookie が生成されると予想しています。

しかし、API を呼び出そうとすると Authorization timed out, or you have switched browsers. Please try again. というエラーが表示されます。

Apple によって生成された新しいコードで再度試しましたが、同じエラーが発生しました。

ログを確認すると、以下のように表示されます。

Started GET "/auth/apple/callback?code=c32f105b5084d42b8bd3e7051873ddb55.0.rrzxz.pChPU9zGlXIHHhgEXLiA5g&state=fbi3bbboud" for
(apple) Setup endpoint detected, running now.
(apple) Callback phase initiated.
(apple) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected
Started GET "/auth/failure?message=csrf_detected&strategy=apple" for 123.253.233.16 at 2023-11-27 06:10:28 +0000
Processing by Users::OmniauthCallbacksController#failure as HTML
  Parameters: {"message"=>"csrf_detected", "strategy"=>"apple"}
  Rendered users/omniauth_callbacks/failure.html.erb within layouts/no_ember (Duration: 4.1ms | Allocations: 17)
  Rendered layout layouts/no_ember.html.erb (Duration: 57.5ms | Allocations: 2882)

Message (47 copies reported)

(apple) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected

Backtrace

/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:163:in `log'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:486:in `fail!'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-oauth2-1.7.3/lib/omniauth/strategies/oauth2.rb:87:in `callback_phase'
/var/www/discourse/plugins/discourse-apple-auth/lib/omniauth_apple.rb:60:in `callback_phase'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:238:in `callback_call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:189:in `call!'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:192:in `call!'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:192:in `call!'

したがって、Discourse の Apple サインインを API で使用するためのこの方向性が正しいかどうか、また csrf_detected エラーの問題をどのように解決できるかを知りたいです。

Apple 認証(および、実際には Discourse の他のすべての認証方法)は、API 経由での使用を想定していません。これらは、サポートされているブラウザーでエンドユーザーが直接使用する必要があります。

どのような問題を解決しようとしていますか?代替案を検討できるかもしれません。

「いいね!」 1

こんにちは@david、返信ありがとうございます。ここで実現したいのは、モバイルアプリがDiscourse APIにアクセスするために使用するAppleログイン用のAPIを作成することです。

Discourse APIを使用してメールとパスワードでログインする場合、次の2つのDiscourse APIで正常に動作します。

  1. {{discourse_host}}/session/csrf.json: このAPIは、次のAPIを使用してログインするために使用されるCookieとCSRFコードを返します。
  2. {{discourse_host}}/session: このAPIは、他のDiscourse APIにアクセスするために使用できる新しいCookieを返します。
Csrf API

Session

DiscourseのAppleログインと同様に、Discourse APIにリクエストを送信して_tCookieを生成することを期待しています。

こんにちは@david、私の問題に対する解決策はありますか?

残念ながら、簡単な答えはありません。このような認証APIは、ウェブ上での実際のユーザー操作なしにトリガーされないように特別に設計されています。

ユースケースとしては、より一般的な解決策はユーザーAPIキーシステムを使用することです。これにより、Discourseが認証ロジックの100%を処理できるようになり、アプリにはユーザーごとのAPIキーが提供されます。この戦略は、ユーザーセッションを「偽装」しようとするよりもはるかに堅牢であるはずです。

「いいね!」 1