Полная рабочая реализация авторизации через Sign in with Apple с Python FastAPI backend и Next.js frontend.
Это референсный проект для интеграции Apple OAuth2 в ваше приложение. Код специально написан максимально просто и понятно, чтобы его можно было легко адаптировать под любой стек технологий.
-
Backend: Python FastAPI (порт 8000)
- Полный OAuth2 flow
- Генерация JWT client_secret
- Обработка callback от Apple
- Валидация токенов
-
Frontend: Next.js + TypeScript (порт 3000)
- Кнопка "Sign in with Apple"
- Страница callback для обработки результата
- Отображение данных пользователя
apple-id/
├── backend/ # Python FastAPI backend
│ ├── main.py # Основной сервер с endpoints
│ ├── config.py # Конфигурация (заполните ключи!)
│ ├── utils.py # Генерация JWT, валидация токенов
│ ├── requirements.txt # Python зависимости
│ └── .env.example # Пример конфигурации
│
├── app/ # Next.js frontend
│ ├── page.tsx # Главная страница с кнопкой авторизации
│ └── callback/
│ └── page.tsx # Обработка результата авторизации
│
├── APPLE_SETUP.md # 📖 Подробная инструкция по настройке
├── package.json # Node.js зависимости и скрипты
└── README.md # Этот файл
Apple Developer Console не принимает localhost или IP адреса для веб-авторизации.
Решение: Используйте ngrok для создания публичного туннеля к вашему локальному серверу.
📖 Подробная инструкция: NGROK_SETUP.md
⚡ Быстрый старт: START.md
✅ Все зависимости уже установлены!
- ✅ Node.js зависимости
- ✅ Python venv создан
- ✅ Python зависимости установлены
- ✅ ngrok установлен
Следуйте подробной инструкции в файле APPLE_SETUP.md
Вам понадобятся:
- Team ID
- Client ID (Services ID)
- Key ID
- Private Key (.p8 файл)
Откройте backend/config.py и заполните все константы вашими значениями.
См. подробную инструкцию: NGROK_SETUP.md
Кратко:
Терминал 1 - Backend:
venv\Scripts\activate
cd backend
python main.pyТерминал 2 - ngrok:
ngrok http 8000Скопируйте ngrok URL (например: https://abc123.ngrok-free.app)
Терминал 3 - Frontend:
npm run devВажно: После получения ngrok URL обновите:
-
Apple Developer Console → Services ID → Configure:
- Domains:
abc123.ngrok-free.app - Return URLs:
https://abc123.ngrok-free.app/auth/apple/callback
- Domains:
-
backend/config.py:
APPLE_REDIRECT_URI: str = "https://abc123.ngrok-free.app/auth/apple/callback" BACKEND_URL: str = "https://abc123.ngrok-free.app"
-
app/page.tsx:
const BACKEND_URL = 'https://abc123.ngrok-free.app';
-
Перезапустите backend
- Frontend: http://localhost:3000
- Backend через ngrok: https://abc123.ngrok-free.app
- ngrok Web UI: http://127.0.0.1:4040
| Endpoint | Метод | Описание |
|---|---|---|
/ |
GET | Информация об API |
/auth/apple/login |
GET | Инициация OAuth flow |
/auth/apple/callback |
POST/GET | Обработка callback от Apple |
/auth/user |
GET | Получение данных пользователя |
/auth/logout |
POST | Выход (удаление сессии) |
/auth/test-config |
GET | Тест конфигурации |
/auth/test-jwt |
GET | Тест генерации JWT |
- Пользователь нажимает "Sign in with Apple" на фронтенде
- Frontend запрашивает URL авторизации у backend (
/auth/apple/login) - Пользователь перенаправляется на Apple
- После авторизации Apple редиректит на backend (
/auth/apple/callback) - Backend обменивает код на токены, создает сессию
- Пользователь перенаправляется на frontend (
/callback?session_id=...) - Frontend запрашивает данные пользователя (
/auth/user)
- ✅ Используйте HTTPS
- ✅ Храните ключи в переменных окружения (
.env) - ✅ Включите полную валидацию ID токенов с проверкой подписи
- ✅ Используйте Redis/БД для хранения сессий
- ✅ Настройте CORS правильно
- ✅ Добавьте rate limiting
- ✅ Логируйте все операции
curl http://localhost:8000/auth/test-configcurl http://localhost:8000/auth/test-jwt- Откройте http://localhost:3000
- Нажмите "Sign in with Apple"
- Войдите с Apple ID
- Проверьте данные на странице callback
# Проверьте что установлены все зависимости
pip install -r backend/requirements.txt
# Проверьте синтаксис config.py
python -c "from backend.config import config; print(config.APPLE_TEAM_ID)"- Проверьте что
APPLE_CLIENT_IDсовпадает с Services ID в Apple Developer Console
APPLE_REDIRECT_URIдолжен точно совпадать с Return URL в Apple Developer Console
- Apple передает email только при первой авторизации
- Удалите приложение из списка авторизованных в настройках Apple ID для повторного теста
Подробнее см. APPLE_SETUP.md → "Решение проблем"
- Подробная инструкция по настройке
- Официальная документация Apple
- REST API документация
- FastAPI документация
- Next.js документация
-
Backend:
- Python 3.8+
- FastAPI - веб-фреймворк
- PyJWT - генерация JWT
- httpx - HTTP клиент
- uvicorn - ASGI сервер
-
Frontend:
- Next.js 16
- React 19
- TypeScript
- Tailwind CSS
Этот проект создан для образовательных целей. Используйте свободно.
Этот референсный проект легко адаптировать под:
- Backend: Django, Flask, Express.js, Go, PHP
- Frontend: React SPA, Vue, Angular, Mobile (iOS/Android)
- База данных: PostgreSQL, MongoDB, Redis
Основная логика в backend/utils.py (генерация JWT) и backend/main.py (OAuth flow) может быть портирована на любой язык.
- Заполните ключи в
backend/config.py(см.APPLE_SETUP.md) - Запустите проект (
npm run dev:all) - Протестируйте авторизацию
- Адаптируйте код под свой проект
- Добавьте хранение пользователей в БД
- Настройте production окружение
Вопросы? Читайте подробную инструкцию в APPLE_SETUP.md 📖
Успехов! 🚀