#web #apple-sign-in
#веб #apple-вход в систему
Вопрос:
Реализация входа Apple в веб-приложение (по старинке ASP.NET , но это не имеет значения — вопрос можно рассматривать как простой HTML / JS POC), вызывающий метод authorize на конечной точке Apple:
https://appleid.apple.com/auth/authorize?client_id=...amp;redirect_uri=...amp;response_type=code id_tokenamp;state=...amp;response_mode=form_postamp;scope=name email
Я хочу получить имя и фамилию пользователя.
Метод возвращает что-то вроде этого:
{
"state": "xxx",
"code": "yyy",
"id_token": "zzz",
"user": {
"name": {
"firstName":"John",
"lastName":"Doe"
},
"email":"example@privaterelay.appleid.com"
}
}
id_token — это JWT, который состоит из идентификатора Apple ID пользователя и электронной почты, данные об имени или фамилии отсутствуют.
Как вы можете видеть, я могу получить имя и фамилию из свойства user. Это единственный известный мне способ.
Проблема в том, что Apple возвращает эти данные только при первом запросе. Это не ошибка, это особенность: https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_js/configuring_your_webpage_for_sign_in_with_apple :
Важно
Apple возвращает объект user только при первой авторизации пользователя в приложении. Сохраняйте эту информацию из вашего приложения; последующие запросы на авторизацию не будут содержать объект user.
Поэтому я сохраняю эти данные для последующего использования в рабочем процессе, я сохраню их в базе данных.
Теперь моя проблема / вопрос:
Когда пользователь удаляет свою учетную запись, я удаляю все их данные из базы данных (я должен, из-за контракта, закона и т.д.).
Когда пользователь снова регистрируется через Apple sign in, я пингую конечную точку Apple, и я больше не получаю пользовательские данные (включая имя и фамилию) (из-за политики Apple, указанной выше)!
Что я должен сделать, чтобы получить его?
Комментарии:
1. Вы финансировали только эту проблему? Во-вторых, отправленной пользователем записи нельзя доверять. После перенаправления на redirect_uri вы можете доверять электронной почте только из отправленного id_token, но вы должны проверить целостность id_token developer.apple.com/documentation/sign_in_with_apple/… ИЛИ вы можете запросить appleid.apple.com/auth/token и id_token из этого запроса между серверами могут быть доверенными напрямую без дополнительной проверки. Но, как указано, проблема в том, что пользователь зарегистрирован, который может быть подделан пользователем / злоумышленником.
Ответ №1:
Я выполняю внутреннюю часть входа в Apple, столкнулся с аналогичной проблемой.
Для IOS 13
- SDK предоставляет uuid пользователя Apple, адрес электронной почты и имя для первого запроса авторизации.
- Мы сопоставляем этот уникальный идентификатор apple_user_uuid с данными профиля в базе данных. (В случае сбоев запроса вы можете попросить серверную часть поместить это в очередь, и приложение должно хранить это в кэше до тех пор, пока внутренний вызов не будет успешным).
Для ANDROID / WEB Flow / IOS ниже 13
-
Впервые при обратном вызове Apple оно отправляет нам имя с одноразовым кодом (срок действия 5 минут).
-
Используя этот код, когда мы вызываем token API, он предоставляет нам id_token JWT.
-
В токене объектом является apple_user_uuid.
-
Сохраняйте его в той же таблице.
Таким образом, теперь в серверной части у вас всегда будут адрес электронной почты, имя, фамилия, помеченные идентификатором apple_user_uuid, который остается постоянным для apple id.
И не удаляйте это сопоставление, если пользователь удалит вашу учетную запись. Пока Apple не предоставит исправление.
Комментарии:
1. Да, не совсем ответ, на который я надеялся, но достаточно близкий. Мне нужно дать задание команде, чтобы сделать это, и я ожидаю, что они закатят глаза: D
2. В любом случае, чтобы каждый раз включать получение имени и электронной почты для конкретного пользователя для тестирования? Настоящая проблема для тестирования, когда вам приходится постоянно создавать идентификаторы Apple.
3. @DavidBrenchley при первом входе в систему с помощью Apple ID служба регистрируется в вашей учетной записи Apple ID. Войдите в свою учетную запись Apple ID в разделе безопасность -> управление приложениями и веб-сайтами -> нажмите сервис и «прекратить использование Apple ID». В следующем запросе авторизации для этого пользователя снова будут указаны имя и адрес электронной почты.