OAuth сервер для авторизации через MISIS (Московский институт стали и сплавов). Позволяет другим сайтам использовать MISIS как провайдера авторизации.
🌐 Рабочий сервис: https://misis-auth.vercel.app/
Это клиент OAuth сервис для МИСИС личного кабинета, который предоставляет безопасную авторизацию для внешних приложений через стандарт OAuth 2.0.
- 🔐 OAuth 2.0 сервер с поддержкой authorization code flow
- 🎓 Интеграция с MISIS личным кабинетом
- 📊 REST API для внешних клиентов
- 🚀 tRPC для внутреннего API
- 💾 MongoDB для хранения данных
- 🎨 Современный UI для управления приложениями
- Frontend: Next.js 15, React 19, TypeScript, Tailwind CSS
- Backend: Next.js API Routes, tRPC
- База данных: MongoDB с Mongoose
- Аутентификация: NextAuth.js
- OAuth: Собственная реализация OAuth 2.0
- Парсинг: Axios + Cheerio для MISIS
- Клонируйте репозиторий:
git clone <repository-url>
cd misis-auth- Установите зависимости:
pnpm install- Настройте переменные окружения:
cp env.example .env.localОтредактируйте .env.local:
# MongoDB
MONGODB_URI=mongodb://localhost:27017/misis-auth
# NextAuth.js
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=your-secret-key-here
# MISIS
MISIS_BASE_URL=https://lk.misis.ru
# OAuth
OAUTH_CLIENT_SECRET=your-oauth-client-secret-here
JWT_SECRET=your-jwt-secret-here- Запустите приложение:
pnpm devGET /api/oauth/authorize
Параметры:
client_id- ID OAuth приложенияredirect_uri- URI для перенаправленияresponse_type- Должен быть "code"scope- Запрашиваемые разрешенияstate- Случайная строка для защиты от CSRF
POST /api/oauth/token
Параметры (form-data):
grant_type- "authorization_code" или "refresh_token"client_id- ID OAuth приложенияclient_secret- Секрет OAuth приложенияcode- Код авторизации (для authorization_code)refresh_token- Refresh token (для refresh_token)redirect_uri- URI для перенаправления
GET /api/v1/user
Authorization: Bearer <access_token>
GET /api/v1/user/profile
Authorization: Bearer <access_token>
POST /api/v1/token/validate
Content-Type: application/json
{
"access_token": "<access_token>"
}
GET /api/v1/oauth/info
Внутренний API для управления приложениями:
auth.getSession- Получение текущей сессииauth.getProfile- Получение профиля пользователяoauth.createApplication- Создание OAuth приложенияoauth.getMyApplications- Получение списка приложенийoauth.updateApplication- Обновление приложенияoauth.deleteApplication- Удаление приложения
read- Базовое чтение данныхprofile- Доступ к профилю пользователяemail- Доступ к email адресуmisis_data- Доступ к данным MISIS
- Войдите в систему
- Перейдите в "OAuth Приложения"
- Нажмите "Создать приложение"
- Заполните данные и получите
client_idиclient_secret
// 1. Перенаправление пользователя на авторизацию
const authUrl = `https://your-misis-auth.com/api/oauth/authorize?` +
`client_id=${CLIENT_ID}&` +
`redirect_uri=${encodeURIComponent(REDIRECT_URI)}&` +
`response_type=code&` +
`scope=read profile&` +
`state=${randomState}`;
window.location.href = authUrl;// 2. Обмен кода на токен
const response = await fetch('https://your-misis-auth.com/api/oauth/token', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: new URLSearchParams({
grant_type: 'authorization_code',
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
code: authorizationCode,
redirect_uri: REDIRECT_URI,
}),
});
const tokenData = await response.json();
// { access_token, token_type, expires_in, refresh_token, scope }// 3. Получение данных пользователя
const userResponse = await fetch('https://your-misis-auth.com/api/v1/user', {
headers: {
'Authorization': `Bearer ${tokenData.access_token}`,
},
});
const userData = await userResponse.json();
// { id, email, misisLogin, profile: { fullName, group, faculty, ... } }src/
├── app/ # Next.js App Router
│ ├── api/ # API Routes
│ │ ├── auth/ # NextAuth.js
│ │ ├── oauth/ # OAuth endpoints
│ │ ├── trpc/ # tRPC
│ │ └── v1/ # REST API v1
│ ├── auth/ # Страницы аутентификации
│ ├── oauth/ # OAuth управление
│ └── page.tsx # Главная страница
├── components/ # React компоненты
├── lib/ # Утилиты и конфигурация
│ ├── auth.ts # NextAuth.js конфигурация
│ ├── mongodb.ts # MongoDB подключение
│ ├── oauth.ts # OAuth сервер
│ ├── trpc.ts # tRPC конфигурация
│ └── misis-client.ts # MISIS парсер
├── models/ # Mongoose модели
├── server/ # tRPC роутеры
└── types/ # TypeScript типы
pnpm devpnpm build
pnpm startpnpm lint- Все пароли хешируются с помощью bcrypt
- JWT токены подписываются секретным ключом
- OAuth токены имеют ограниченное время жизни
- Валидация всех входящих данных
- Защита от CSRF атак
MIT License
Для вопросов и предложений создавайте issues в репозитории.