プラグインのフォークを アップデート し、最新の omniauth-apple を使用しようと試みました(バージョン番号の更新だけでなく、他にもいくつかの変更が必要である点にご注意ください)。
tl;dr: まだ動作しません
サンドボックス環境では一時的に動作するようにハックしましたが、依然としていくつかの問題が残っています:
-
Apple はコールバックで POST リクエストを使用しています。これは OAuth 実装では一般的ではなく、
samesite=Laxのクッキーがリクエストと一緒に送信されないことを意味します。その結果、Discourse はコールバック中にセッションクッキーを読み取ることができず、CSRF エラーをスローしてしまいます。非安全な回避策として、Discourse のクッキーを
samesite=Noneに変更してこのセキュリティ機能を無効化する方法があります。 -
CSRF トークンなしで POST リクエストを使用すると、コア部分の別のセキュリティ対策もトリガーされてしまいます。
非安全な回避策として、この行 を削除する方法があります。
-
omniauth gem が JWKs を取得 する際、Apple から 403 エラーが返されていました。
Accept:ヘッダーが正しく設定されていないのではないかと疑っていますが、まだ確認できていません。非安全な回避策として、キーをハードコーディングする方法がありました。
これらの作業の末、ようやく Apple でのログインに成功しました。https://sandbox.dtaylor.uk で試すことができます(数日間動作させたままにしますが、ここには非安全なため、機密性の高い情報は入力しないでください)。
しかしその後、メールや名前は最初の認証時のみ含まれるという問題が残っています。試してみてください:Apple でサインインし、アカウント作成をキャンセルしてから再度試みます。2 回目の試みでは、あなたの情報が欠落しています。
つまり、Apple が近々仕様を変更しない限り、これをどう実現すればよいでしょうか?
(1) と (2) については、セキュリティを損なうことなく、Apple の POST を GET に変換できると思います。コールバックで POST を受け取った際、window.location='/auth/apple/callback?code=...&state=...' を設定する JavaScript をレンダリングします。そこから先は、他のプロバイダーと同じように動作するはずです。ただし、POST をインターセプトするには、コア API の変更が必要になると思われます。
(3) については、omniauth gem で少し手を加えることで修正できるかもしれません。
しかし、依然として名前やメールが取得できない状況に置かれているため、これらの他の問題を修正する価値があるかどうかはわかりません ![]()