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

Aug 20 2020

Реализация входа Apple в веб-приложение (старомодный ASP.NET, но это не имеет значения - вопрос можно рассматривать как простой HTML / JS POC), вызывая метод авторизации на конечной точке Apple:

https://appleid.apple.com/auth/authorize?client_id=...&redirect_uri=...&response_type=code%20id_token&state=...&response_mode=form_post&scope=name%20email

Я хочу получить имя и фамилию пользователя. Метод возвращает что-то вроде этого: {

   "state": "xxx",
   "code": "yyy",
   "id_token": "zzz",
   "user": {
        "name": {
            "firstName":"John",
            "lastName":"Doe"
        },
        "email":"[email protected]"
    }
}

id_token - это JWT, который состоит из идентификатора яблока и электронной почты пользователя, нет данных об имени или фамилии.

Как видите, я могу получить имя и фамилию из свойства пользователя . Это единственный известный мне способ.

Проблема в том, что Apple возвращает эти данные только при первом запросе. Это не ошибка, это особенность:https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_js/configuring_your_webpage_for_sign_in_with_apple :

Важный

Apple возвращает объект пользователя только при первой авторизации приложения. Сохраните эту информацию из своего приложения; последующие запросы авторизации не будут содержать объект пользователя.

Поэтому я сохраняю эти данные для дальнейшего использования в рабочем процессе, я сохраню их в базе данных.

Теперь моя проблема / вопрос:

Когда пользователь удаляет свою учетную запись, я удаляю все его данные из базы данных (я должен это сделать из-за контракта, закона и т. Д.).

Когда пользователь снова регистрируется через вход в систему Apple, я проверяю связь с конечной точкой Apple, и я больше не получаю данные пользователя (включая имя и фамилию) (из-за политики Apple, указанной выше)!

Что мне делать, чтобы это получить?

Ответы

3 AnkitMishra Aug 28 2020 at 09:57

Я делаю внутреннюю часть входа в систему Apple, столкнулся с аналогичной проблемой.

Для iOS 13+

  • SDK предоставляет идентификатор пользователя Apple, адрес электронной почты и имя для первого запроса авторизации.
  • Мы сопоставляем этот уникальный идентификатор apple_user_uuid с данными профиля в БД. (В случае сбоев запроса вы можете попросить серверную часть поместить это в очередь, и приложение должно хранить это в кеше до тех пор, пока внутренний вызов не будет успешным).

Для ANDROID / WEB Flow / IOS ниже 13

  • Впервые в обратном вызове Apple он отправляет нам имя с одноразовым кодом (истечение 5 минут).

  • Используя этот код, когда мы вызываем токен API, он предоставляет нам id_token JWT.

  • В токене тема - apple_user_uuid.

  • Сохраните это в той же таблице.

Итак, теперь у вас всегда будет адрес электронной почты, firstName, lastName с тегами apple_user_uuid, которые остаются постоянными для идентификатора Apple.

И не удаляйте это сопоставление, если пользователь удаляет вашу учетную запись. Пока Apple не исправит ошибку.