Skip to content

Sign in with Apple: при удалении аккаунта отзывать токены Apple (App Store 5.1.1(v)) — до публичной подачи #407

Open

Description

@efymd9

Контекст

PR #406 (#277) добавляет вход через Apple. Правило App Store 5.1.1(v) (с 30.06.2022) требует: если приложение даёт Sign in with Apple, удаление аккаунта должно отзывать токены Apple через REST API Apple (/auth/revoke). Сейчас «Удалить аккаунт» (/api/v1/account/delete, #309) стирает наши данные и удаляет пользователя в Clerk, но токены Apple не отзывает — это строка реестра из #406. TestFlight это правило не проверяет, проверка будет при подаче в стор.

Что выяснить и сделать

  1. Делает ли это Clerk сам при users.deleteUser для пользователя с внешним аккаунтом Apple. Ответ брать из документации Clerk и поведения установленного @clerk/backend, не по памяти.
  2. Если нет — отзыв на нашей стороне в маршруте удаления: Clerk отдаёт токен OAuth Apple (users.getUserOauthAccessToken или аналог), запрос в appleid.apple.com/auth/revoke с client secret (JWT, подписанный ключом Sign in with Apple — ключ создаёт владелец в Apple Developer). Отзыв best-effort, без блокировки удаления, лог по id.
  3. Ключ Sign in with Apple (.p8) и Key ID — секреты, только в env Vercel. Это действие владельца.

Критерии

Ответ на п.1 с доказательством. При необходимости — реализация с тестом (мок Apple) и кейсом лог-аудита. Обновлённая строка реестра.

GDPR: применимо — отзыв доступа стороннего обработчика при стирании (ст. 17).

Activity

  1. added
    type:bugЧто-то работает не так
    domain:mobileExpo/React Native приложение (mobile/)
    p2Обычный приоритет
    by:claude-codeIssue завела основная сессия Claude Code
    on Oct 4, 2026
  2. added
    spec:readyСпека готова — задачу можно брать в работу
    on Oct 9, 2026
  3. efymd9 commented on Oct 9, 2026

    @efymd9
    OwnerAuthor

    Ответ на п.1 спеки и выбранный дизайн (до кода)

    Коротко: Clerk токены Apple не отзывает и отзывать ему нечем — у него нет ни refresh-, ни access-токена Apple для пользователя, вошедшего нативно. Отзыв делаем своим путём, документированным Apple: свежий authorizationCode с устройства при «Delete account» → обмен на сервере → /auth/revoke.

    Доказательства

    1. Что нативный поток отдаёт Clerk. Установленный @clerk/expo 4.7.1, mobile/node_modules/@clerk/expo/dist/hooks/useSignInWithApple.ios.js:
      const { identityToken, fullName } = await AppleAuthentication.signInAsync({ requestedScopes: [...], nonce });
      await signUp.create({ strategy: "oauth_token_apple", token: identityToken, ... });
      // при отказе sign-up: signIn.create({ strategy: "oauth_token_apple", token: identityToken })
      authorizationCode из credential не читается вовсе. Типы @clerk/shared (dist/types/signUpFuture.d.ts): «'oauth_token_apple': The user will be authenticated using a native Sign in with Apple identity token».
    2. Что принимает /auth/revoke. Apple, Revoke tokens: token — «The user refresh token or access token intended to be revoked»; token_type_hint — refresh_token или access_token; и прямо: «In order to revoke authorization for a user, you must obtain a valid refresh token or access token. If you don't have either token for the user, you can generate tokens when validating an authorization code». Identity token в этот список не входит.
    3. Откуда берутся refresh/access-токены. Apple, Generate and validate tokens: только обмен authorization_code на POST /auth/token (client_secret обязателен); код «single-use only and valid for five minutes». Clerk кода не получал → обменивать ему нечего → токенов у него нет.
    4. @clerk/backend 3.22.0 (установлен): getUserOauthAccessToken(userId, provider) = GET /users/{id}/oauth_access_tokens/oauth_apple; ресурс OauthAccessToken несёт token (access), scopes, expiresAt, idToken — поля refresh-токена нет вовсе. Для нативного пользователя там пусто (п.3); даже у веб-OAuth access-токен Apple живёт час (expires_in: 3600) — к моменту удаления он мёртв, надёжной ручкой для отзыва он не является. deleteUser = голый DELETE /users/{id}.
    5. Документация Clerk (страницы Sign in with Apple для web, iOS, Expo, useSignInWithApple, getUserOauthAccessToken) про отзыв токенов Apple при удалении пользователя не говорит ничего.
    6. Apple, Offering account deletion in your app: «Apps that support Sign in with Apple should use the Sign in with Apple REST API to revoke user tokens».

    Итог: вариант «Clerk делает сам» (a) и «Clerk отдаёт токен» (b) отпадают. Делаем (c).

    Дизайн (c)

  4. added
    needs:ownerЖдёт решения или действия владельца
    on Oct 11, 2026
  5. efymd9 commented on Oct 11, 2026

    @efymd9
    OwnerAuthor

    Код влит (PR #427, порядок по варианту (а) владельца, 11.10). Задача открыта с needs:owner: ключ Sign in with Apple в Vercel (APPLE_TEAM_ID / APPLE_SIGN_IN_KEY_ID / APPLE_SIGN_IN_PRIVATE_KEY) и проверки на устройстве из строки реестра #407 — гейт перед публичной подачей и перед включением apple в APP_SOCIAL_SIGNIN.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    by:claude-codeIssue завела основная сессия Claude Codedomain:mobileExpo/React Native приложение (mobile/)needs:ownerЖдёт решения или действия владельцаp2Обычный приоритетspec:readyСпека готова — задачу можно брать в работуtype:bugЧто-то работает не так

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions