Я попытался обновить наш форк плагина, чтобы использовать последнюю версию omniauth-apple. (Обратите внимание, что требуются некоторые другие изменения, а не просто обновление номера версии).
Кратко: всё ещё не работает.
Мне удалось с помощью хаков заставить это работать в моей песочнице, но всё ещё есть ряд проблем:
-
Apple использует POST-запрос в колбэке. Это нехарактерно для реализаций OAuth, так как это означает, что куки с samesite=Lax не будут отправлены с запросом. Из-за этого Discourse не может прочитать куки сессии во время колбэка и выдает ошибку CSRF.
НЕБЕЗОПАСНЫЙ обходной путь — отключить эту защиту, изменив настройки куки Discourse на samesite=None.
-
Использование POST-запроса без CSRF-токена также активирует ещё одну меру безопасности в ядре.
НЕБЕЗОПАСНЫЙ обходной путь — удалить эту строку.
-
Я получал ошибку 403 от Apple, когда gem omniauth запрашивал JWK. Подозреваю, что заголовок Accept: устанавливается неправильно, но я это не подтвердил.
НЕБЕЗОПАСНЫЙ обходной путь заключался в том, чтобы зашить ключи в код.
После всего этого мне наконец удалось войти через Apple. Вы можете попробовать это на https://sandbox.dtaylor.uk (я оставлю это работающим на несколько дней, но, пожалуйста, не вводите там ничего конфиденциального, так как это НЕБЕЗОПАСНО).
И затем… электронные адреса и имена всё ещё включаются только при первой аутентификации. Вы можете это проверить: войдите через Apple, отмените создание аккаунта, а затем попробуйте снова. При второй попытке ваши данные будут отсутствовать.
Итак, предполагая, что Apple не планирует что-то менять в ближайшее время… как мы можем заставить это работать?
Для пунктов (1) и (2) я думаю, мы могли бы преобразовать POST-запрос Apple в GET, не нарушая безопасность. Когда мы получаем POST на колбэке, мы рендерим JavaScript, который устанавливает window.location='/auth/apple/callback?code=...&state=...'. С этого момента всё будет работать так же, как и с любым другим провайдером. Однако, я думаю, перехват POST-запроса потребует некоторых изменений в API ядра.
Для пункта (3) я думаю, это, вероятно, можно исправить с помощью небольшой доработки в gem omniauth.
Но мы всё ещё застряли без имени и электронной почты, поэтому я не уверен, стоит ли исправлять эти другие проблемы 