Вход Apple, метод авторизации возвращает имя только с первого раза

#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». В следующем запросе авторизации для этого пользователя снова будут указаны имя и адрес электронной почты.