Интеграция с системой аутентификации и авторизации (SSO)
Кратко этапы интеграции с SSO выглядят так:
- запросить доступ к API SSO для тестирования и дождаться ответа с секретным ключом;
- реализовать логику обращения к нашему API;
- добавить кнопку авторизации через Университет 20.35;
- протестировать взаимодействие с нашим API, в том числе бизнес-логику;
- запросить доступ к API SSO на промышленном контуре.
Для получения консультации по интеграции в рамках тестового контура необходимо с корпоративного адреса электронной почты ответить на ранее направленное письмо на apps@2035.university с сутью вопроса, приложив по возможности скриншоты/скринкасты до и после описываемого события, url и параметры запросов.
Обратите внимание!
Для ускорения обработки обращений всю дальнейшую переписку лучше вести с этого же адреса.
Запрос доступов к API SSO
Запросы на временное подключение для тестирования и на подключение к промышленному контуру имеют одинаковый формат. Для запроса доступа к ИС необходимо с корпоративного адреса отправить письмо на apps@2035.university с темой письма «Доступ к SSO, Тестовый/Промышленный контур, Название проекта, Название организации».
В теле письма необходимо указать:
- Проект: Название проекта
- Полное название организации
- Контур: тестирование/промышленный
- Ответственное за интеграцию лицо:
- ФИО
- телефон.
- Домен/ссылка сервиса (url) – адрес, откуда будут отправляться запросы. Если ссылок несколько, то нужно будет создавать несколько OAuth клиентов;
- Домен/ссылка перенаправления (redirect_uri) – адрес, на который будет перенаправлен пользователь после авторизации в SSO, к которому также будет добавлен get параметр code;
- Идентификатор приложения клиента (client_id) – формируется клиентом самостоятельно и проверяется Университетом 2035 на уникальность (обычно название организации на латинице без пробелов, например, «nashaorganizaciya»). Не желательно оставить пустым - тогда он будет сгенерирован автоматически в виде уникального идентификатора.
В течение 3 дней вы получите в ответ письмо с client_id и с секретным ключом.
Для тестирования выдается временный доступ на 5 рабочих дней. По истечении 5 рабочих дней доступ отзывается. Доступ может быть продлен по запросу.
Взаимодействие с провайдером аутентификации и авторизации (SSO)
Провайдер аутентификации и авторизации (SSO) является сервисом авторизации, работающим по протоколу OAuth2.
Для начала взаимодействия необходимо выполнить последовательно действия по подключению к SSO, сообщив идентификатор приложения (client_id) и ссылку перенаправления (redirect_uri), получив в ответ токен.
При аутентификации веб-приложений, во время прямого взаимодействия с пользователем используется аутентификация при помощи OAuth2, и в этом случае информацию из профиля пользователя можно получить по ссылке users/me.
URL SSO https://sso.2035.university.
Начало процесса авторизации
GET
/oauth2/authorize?client_id=<client_id>&redirect_uri=<redirect_uri>&response_type=code</redirect_uri></client_id>
где:
- <CLIENT_ID> - идентификатор приложения, зарегистрированного в SSO;
- <redirect_uri> - адрес, на который будет перенаправлен пользователь, к которому также будет добавлен get параметр YOUR_CODE_FROM_AUTHORIZE.</redirect_uri>
Здесь и ниже значение параметра REDIRECT_URI должно совпадать со значением, переданным при подключении, если будет отличаться, то будет возвращен код ошибки.
Получение sso_access_token
POST /oauth2/access_token
-H"content-type: application/x-www-form-urlencoded"
Тело запроса:
client_id=<client_id>&client_secret=<client_secret>&code=<your_code_from_authorize>&grant_type=authorization_code&redirect_uri=<redirect_uri></redirect_uri></your_code_from_authorize></client_secret></client_id>
где:
- <client_id> - идентификатор приложения, зарегистрированного в SSO;</client_id>
- <client _secret=""> - токен для SSO, получаемый при выполнении порядка подключения к API;</client>
- <your_code_from_authorize> - code, полученный в ответе на запрос в пункте «Начало процесса авторизации»;</your_code_from_authorize>
- <redirect_uri> - адрес, на который будет перенаправлен пользователь после авторизации в SSO, к которому также будет добавлен get параметр SSO_ACCESS_TOKEN.</redirect_uri>
Запрос идентификатора пользователя (leader_id, unti_id)
GET /users/me
-H"Authorization: Bearer <sso_access_token></sso_access_token>
<sso_access_token> - токен, полученный в ответе на запрос в пункте «Получение sso_access_token». </sso_access_token>
Формат ответа:
- unti_id (int) id пользователя
- username (str) логин
- email (str) емейл
- lastname (str) фамилия
- firstname (str) имя
- secondname (str) отчество
- leader_id (str) id пользователя в leader-id
- tags (list) список тегов пользователя
Пример бэкенда для python https://pastebin.com/F3Z5MFSz.
Пример бэкенда для PHP (moodle плагин) https://github.com/u2035/moodle-sso-oauth.
Пример ответа:
* {
"unti_id": 1,
"username": "user",
"email": "user@example.com",
"lastname": "Иванов",
"firstname": "Иван",
"secondname": "Иванович",
"leader_id": "123456",
"tags": ["assistant"],
}
* 401 если пользователь не авторизован
Обращаем ваше внимание, что email адрес не проходил валидации с нашей стороны.
Кнопка авторизации через Университет 20.35
Для случаев, когда неавторизованный в 20.35 пользователь заходит на курс с сайта провайдера, ему должна быть доступна кнопка входа через Университет 20.35.
Гайд для провайдеров по использованию элементов дизайна 2035 (в том числе кнопок входа) находится здесь:
Гайд для провайдеров по использованию элементов дизайна 2035
Тестирование
Для получения консультации по интеграции в рамках тестового контура необходимо с корпоративного адреса электронной почты ответить на ранее направленное письмо на apps@2035.university с сутью вопроса, приложив по возможности скриншоты/скринкасты до и после описываемого события, url и параметры запросов.
Сценарии тестирования
Необходимо протестировать основные сценарии:
- Прозрачная авторизация в системе провайдера не зарегистрированного ранее пользователя.
- При прямом переходе на курс неавторизованного пользователя, а также в случае автоматического прекращения сессии пользователя по времени на сайте провайдера, должна быть возможность по кнопке войти через Университет 20.35. Кнопка должна соответствовать одной из https://files.2035.university/d/26a31d08ce9a442fa713/.
Типовые ошибки при интеграции с SSO
Ошибка:
Сервис отвечает “invalid_request The requested redirect didn't match the client settings” в запросе /oauth2/authorize.
Решение:
В запросе указали неверный redirect_uri (отличающийся от указанного в запросе на доступ). Напишите письмо с просьбой изменить его.
Указанный в запросе redirect_uri, должен точно совпадать с прописанным в настройках клиента (например, если в клиенте https://staging.experts.work/, а в запросе http://staging.experts.work/ или https://staging.experts.work или https://staging.experts.work/auth/callback/, вы получите ошибку)!
Ошибка:
500 в запросе /oauth2/access_token
Решение:
В запросе на /oauth2/authorize не нужно указывать scope=openid и nonce, из-за этого потом возникает 500 в запросе /oauth2/access_token.
Ошибка:
500 в запросе /oauth2/access_token.
Решение:
Некорректное значение client_secret в /oauth2/access_token. Проверьте, что передаете корректное значение в соответствии с контуром, не потеряли символы в конце/начале и т.п.
Ошибка:
invalid_grant в запросе /users/me.
Решение:
Невалидный access_token, проверьте, что подставляете корректный.
Ошибка:
unauthorized_client An unauthorized client tried to access your resources.
Решение:
Некорректный client_secret или client_id, проверьте, что подставляете корректный (не потеряли/не добавили знаки/пробелы, используете нужную среду (прод/тест).
Частые вопросы по интеграции с SSO
Вопрос:
Откуда выполнять код - с сервера или с клиента?
Ответ:
Только с сервера! Это единственный безопасный вариант.
Вопрос:
Какая информация будет в payload?
Ответ:
Там будет ключ access_token и (3) refresh_token. Это довольно легко можно проверить, пройдя шаги для получения токена, если уже есть client/secret.
Вопрос:
Как произвести валидацию токена? Например, есть ли endpoint получения публичного ключа?
Ответ:
Например, запросить информацию о пользователе /users/me, этот эндпоинт требует валидный токен.