API сервиса аутентификации и авторизации в приложение Твой ФФ!
-
Перейдите в папку проекта
-
Создайте виртуальное окружение командой и активируйте его:
foo@bar:~$ python3 -m venv venv
foo@bar:~$ source ./venv/bin/activate # На MacOS и Linux
foo@bar:~$ venv\Scripts\activate # На Windows- Установите библиотеки
foo@bar:~$ pip install -r requirements.txt- Запускайте приложение!
foo@bar:~$ python -m auth_backendDB_DSN– Адрес базы данных в фаорматеpostgresql://admin:admin@localhost:5432/devEMAIL– Адрес электронной почты (логин для входа) для отправки уведомлений по EmailEMAIL_PASS– Пароль от электронной почтыHOST– Хост для использования в шаблонах сообщений электронной почты
GOOGLE_REDIRECT_URL: str– URL адрес страницы для получения данных авторизации на нашем фронтэндеGOOGLE_SCOPES: list[str]– Запрашиваемые у гугла права на управление аккаунтом, по умолчанию запрашивает данные пользователяGOOGLE_CREDENTIALS: Json– Данные приложения Google, получить можно в Google Cloud Console
PHYSICS_REDIRECT_URL: str– см. секцию GooglePHYSICS_SCOPES: list[str]– см. секцию GooglePHYSICS_CREDENTIALS: Json– см. секцию Google
LKMSU_REDIRECT_URL– URL адрес страницы для получения данных авторизации на нашем фронтэнде
YANDEX_REDIRECT_URL– URL адрес страницы для получения данных авторизации на нашем фронтэндеYANDEX_CLIENT_ID- ID приложения, созданного в ЯндексеYANDEX_CLIENT_SECRET- Ключ для получения токена пользователя в Яндексе
MYMSU_REDIRECT_URL– см. секцию YandexMYMSU_CLIENT_ID- см. секцию YandexMYMSU_CLIENT_SECRET- см. секцию Yandex
TELEGRAM_REDIRECT_URL– URL адрес страницы для получения данных авторизации на нашем фронтэндеTELEGRAM_BOT_TOKEN- Токен бота приложения
- Дернуть ручку
POST /email/registrate. Вы передаете{email: "", password: ""} - На почту приходит письмо с линком на
GET /email/approve?token='...', если по ней перейти то почта будет подтверждена и регистрацию можно считать завершенной.
- Дернуть ручку
POST /email/login. там всего один вариант логина, никуда не денетесь - В теле запроса есть scopes, это обязательный параметр. scopes - это лист айдишников, существующих в группах в которых вы состоите прямо или в группах, которые являются родителями ваших групп. Он может быть равен [], если вам не нужны права для этого токена.
- Вам придет токен, сохраняйте его куда нибудь, срок действия ограничен.
- Дернуть ручку
POST /email/reset/password/request. Вы передаете{email: ""}в нагрузке - Вам придет письмо, где будет ссылка НА ФРОНТ(надо сделать это), в ссылке будет reset_token
- Токен надо передать в ручку
POST /email/reset/passwordв заголовках, вместе с{email: "", new_password: ""}и пароль будет изменен. email не понадобится после решения #36
- Если пароль не забыт, а просто надо его поменять. Тогда в
POST /email/reset/password/requestпередается токен авторизации, в теле вы передаете{email: "", password: "", new_password: ""} - Отправляете запрос и всё, пароль изменен, вам придет письмо с уведомлением о смене пароляю
- Дернуть ручку
POST /email/reset/email/request. Всего один вариант, передаете новое мыло в теле{email: ""}и токен атворизации в заголовках - На почту придет письмо с подтверждением почты, там будет токен подтверждения в query параметрах. Ссылка ведет на ручку GET пока что, но надо переделать, чтобы тоже вела на фронт.
Все примеры написаны для Google аккаунта, для аккаунта physics.msu.ru средует делать запросы к /physics-msu вместо /google
- Получаем адрес для запроса на сервер Google:
GET /google/auth_url - Редиректим пользователя на этот url, пользователь входит в аккаунт и возвращается на страницу, которую можно узнать запросом
GET /google/redirect_url - Если Google не передал в ответе GET параметр
error, передаем GET параметры страницы на сервер авториации в теле POST запроса в формате JSON:POST /google/login. Иначе возвращаем ошибку авторизации - При успешном входе получаем
tokenсессии. В теле запроса есть scopes, это обязательный параметр. scopes - это лист айдишников, существующих в группах в которых вы состоите прямо или в группах, которые являются родителями ваших групп. Он может быть равен [], если вам не нужны права для этого токена. Если сервер авторизации ответил ошибкой 401:- запоминаем значение id_token из ответа.
- Предлагаем пользователю завести новый аккаунт нашего приложения, связанный с гуглом
- Если пользователь соглашается, делаем запрос с
{"id_token": "<id-token>"}в теле на адресPOST /google/register. При успешном входе получаемtokenсессии, иначе показываем экран ошибки авторизации. В теле запроса есть scopes, это обязательный параметр. scopes - это лист айдишников, существующих в группах в которых вы состоите прямо или в группах, которые являются родителями ваших групп. Он может быть равен [], если вам не нужны права для этого токена.
Все примеры написаны для Google аккаунта, для аккаунта physics.msu.ru средует делать запросы к /physics-msu вместо /google
- Получаем адрес для запроса на сервер Google:
GET /google/auth_url - Редиректим пользователя на этот url, пользователь входит в аккаунт и возвращается на страницу, которую можно узнать запросом
GET /google/redirect_url - Если Google не передал в ответе GET параметр
error, передаем данные на сервер авториации:POST /google/register, указываем заголовокAuthorization: <auth-token>. Иначе возвращаем ошибку авторизации - При успешном входе получаем
tokenсессии, иначе показываем экран ошибки авторизации
- Получаем адрес обычным способом, перенаправляем туда пользователя
- После выдачи доступа пользователь попадает на redirect url с параметром #tgAuthResult=...
- На этой странице должен быть встроен виджет авторизации телеграмма, который преобразует #tgAuthResult=... в ?first_name=...&user_name=...
- Отослать данные из GET параметров в виде словаря на ручку
GET /telegram/login - При успешном входе получаем
tokenсессии, иначе показываем экран ошибки авторизации
- У вас должен быть аккаунт с правом на создание скоупсов :)
- Получаете токен со скоупом auth.scope.create
- Идете с токеном на ручку
POST /scope, отправляете его туда в заголовке и в теле отправляете `{name: str - имя скоупа(там должно быть две точки и три слова без пробелов), comment - комментарий} - Профит
-
Продумайте, какой путь должен совершить пользователь, чтобы войти в сервис с использованием вашего метода аутентификации
- Все методы должны поддерживать минимум 2 варианта взаимодействия: регистрация нового пользователя (она же, добавление метода аутентификации существующему пользователю) и повторный вход.
- Большинство внешних приложений (Google/Yandex/Telegram и др.) уже придумали все за вас и используют стандарт OAuth2 для авторизации внешних приложений, поэтому они очень похожи друг на друга и можно посомтреть примеры. Google авторизация уже реализована и можно почитать пути пользователя выше.
-
Определитесь, какие методы нужны для работы с вашим методом авторизации.
- По умолчанию есть 2 API ручки:
/login– вход (повторный), и/register– первичная регистрация/добавление нового метода авторизации - Для OAuth2 авторизации и аутентификации также обязательно определены ручки
/auth_urlи/redirect_url– возвращают URL, куда пользователя должен перенаправить наш фронтенд для ввода логина и пароля на внешнем ресурсе, и URL, куда внешнее приложение перенаправит результат входа, соответственно - Вы можете определить и свои методы, но помните, что их нужно также поддержать и на фронтенде приложения. Обязательно опишите пошагово (а лучше нарисуйте схему в Miro или draw.io), как будут рабоать ваши методы со стороны пользователя/фронтенда
- По умолчанию есть 2 API ручки:
-
Создайте новый файл в папке
auth_backend/auth_plugins, создайте класс и отнаследуйте его- для legacy аутентификации от
- для OAuth аутентификации от
-
Задайте классу описание,
prefixиtagsauth-api/auth_backend/auth_plugins/google.py
Lines 31 to 34 in 1ce51bd
prefixиспользуется как отправная точка для ваших методов. Ручка логина для метода авторизации с премиксом/myauthбудет/myauth/login- Описание и теги используются для документирования кода. Зачастую без них непонятно, что вообще происходит. Не пропускайте их.
-
Создайте основные методы
- Помните, что все методы являются
@staticmethodили@classmethod. То есть не принимают аргументself(текущий объект), а принимают ничего илиcls(текущий класс) соответственно - Ручки
/loginи/registerимеют сигнатурыasync def _login(...)иasync def _register(...)соответственно - Ручка
/loginобязательно возвращает объектauth-api/auth_backend/models/db.py
Line 117 in 1ce51bd
- Ручки
/auth_urlи/redirect_urlметодов OAuth2 обязательно возвращают оъектauth-api/auth_backend/auth_plugins/auth_method.py
Lines 115 to 116 in 1ce51bd
- Помните, что все методы являются