diff --git a/.gitignore b/.gitignore index a6158de..2668ed7 100644 --- a/.gitignore +++ b/.gitignore @@ -483,3 +483,5 @@ $RECYCLE.BIN/ # Windows shortcuts *.lnk + +src/appsettings.Development.json diff --git a/LICENSE b/LICENSE index fb8a284..c46dece 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2025 serega404 +Copyright (c) 2025 Sergey Karmanov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including diff --git a/README.md b/README.md index 3501ba3..bc178d9 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,58 @@ # ModeusSchedule.MSAuth +## Зачем нужен этот сервис + +ModeusSchedule.MSAuth — это вспомогательный HTTP-сервис, который автоматизирует авторизацию в Microsoft, заходит в веб-интерфейс Modeus и извлекает свежий `id_token` (JWT). Этот токен затем может использоваться другими компонентами вашей системы для обращения к API Modeus без ручного входа пользователя. Проект устраняет необходимость хранить пользовательские cookie, а также упрощает раздачу короткоживущих токенов другим сервисам через REST‑эндпоинт. + +## Ключевые возможности + +- Браузерная авторизация через Playwright и Chromium в режиме headless. +- Кэширование токена на 20 минут, чтобы избежать лишних логинов. +- Ограничение параллельных попыток авторизации (возврат HTTP 429, если процесс уже идет). +- Опциональная защита API ключом (заголовок `X-API-Key`). +- Простой REST‑эндпоинт `GET /auth/ms`, который возвращает JSON `{ "jwt": "..." }`. + +## Как это работает + +1. Сервис при старте проверяет, что заданы параметры подключения к Modeus и учетные данные Microsoft (`MODEUS_URL`, `MS_USERNAME`, `MS_PASSWORD`). +1. При первом запросе Playwright поднимает headless Chromium и логинится в Modeus через Microsoft IDP. +1. После успешного входа токен `id_token` извлекается из `sessionStorage`, сохраняется в памяти и отдается клиенту. +1. Пока токен свежий, новые запросы обслуживаются из кэша. Как только TTL истекает, запускается новая авторизация. + +## Конфигурация + +| Параметр | Где задается | Назначение | +| --- | --- | --- | +| `MODEUS_URL` | `appsettings.json` / переменные окружения | URL портала Modeus (например, `https://<название вуза>.modeus.org/`). | +| `MS_USERNAME` | `appsettings.json` / переменные окружения | Логин сервисной учетной записи Microsoft 365. | +| `MS_PASSWORD` | `appsettings.json` / переменные окружения | Пароль от этой учетной записи. | +| `API_KEY` *(опционально)* | `appsettings.json` / переменные окружения | Если задан, сервис будет требовать заголовок `X-API-Key`. | + +## Быстрый старт + +1. Установите .NET 9 SDK и Playwright (будет поставлен автоматически при первом запуске). +1. Создайте файл `appsettings.Development.json` или задайте переменные окружения с параметрами из таблицы выше. +1. Соберите и запустите сервис: + +```bash +cd src +dotnet run +``` + +1. Выполните запрос: + +```bash +curl -H "X-API-Key: <ваш ключ>" http://localhost:5000/auth/ms +``` + +В ответ вы получите JSON с полем `jwt`. При повторных вызовах в пределах времени жизни кэша сервис не будет заново входить в Microsoft. + +## Безопасность и эксплуатация + +- Используйте отдельную сервисную учетную запись Microsoft с минимально необходимыми правами. +- Ограничьте доступ к эндпоинту по сети (VPN, reverse proxy) и включите проверку `API_KEY`. +- Логи Playwright могут содержать диагностическую информацию, поэтому убедитесь, что они не раскрывают пароли. + +## Лицензия + +Проект распространяется под лицензией MIT. Подробнее в файле [`LICENSE`](LICENSE). diff --git a/src/Properties/launchSettings.json b/src/Properties/launchSettings.json index 522d3d7..596fb6c 100644 --- a/src/Properties/launchSettings.json +++ b/src/Properties/launchSettings.json @@ -5,7 +5,7 @@ "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": false, - "applicationUrl": "http://localhost:5258", + "applicationUrl": "http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }