Spring с OAuth2/OIDC: полный пример интеграции
Пример полной интеграции Spring с OIDC 1.0 и OAuth2.1, управляемый Maven.
Используемые основные технологии и версии:
- JDK (openjdk 17);
- Spring Boot (3.1.5);
- Spring Core (6.0.11);
- spring-security-oauth2-authorization-server (1.1.1);
- thymeleaf (3.1.1.RELEASE).
Лицензионное соглашение: GPL-2.0
Технические видео:
- spring-oauth-server: история открытого проекта. 2018-09-16;
- Как запустить spring-oauth-server локально (традиционная версия). 2018-09-17;
- Как запустить spring-oauth-сервер локально (версия config). 2018-10-08;
- Использование онлайн-тестовой среды. 2018-10-14;
- Краткое описание обновления spring-oauth-server v2.0.1. 2019-08-05.
Примечание: эти видео в основном подходят для версии v2.x.
http://list.youku.com/albumlist/show/id_51900110.html
(постоянно обновляется...)
1000 star Gitee Award Cup: sos-1000-stars.jpg [2019].
Описание ветвей:
— MySQL: посетите Branch master;
— MongoDB: посетите Branch mongodb;
— Redis: посетите Branch config-redis.
Связанные проекты:
- OAuth2 клиентский проект: spring-oauth-client;
- Онлайн-тест: https://andaily.com/spring-oauth-server;
- Shiro с OLTU: OAuth2 проект: https://gitee.com/mkk/oauth2-shiro.
Как использовать?
- Проект управляется Maven, требуется локальная установка Maven (версия разработки — 3.6.0) и MySql (версия разработки — 5.7.22).
- Скачайте или клонируйте исходный код проекта на локальный компьютер.
- Создайте базу данных MySQL (по умолчанию — oauth2_boot), запустите соответствующий SQL-скрипт (файл находится в каталоге others/database). Порядок запуска скриптов: initial_db.ddl -> oauth.ddl -> initial_data.ddl.
- Измените информацию о подключении к базе данных в файле application.properties (находится в каталоге src/main/resources).
- Импортируйте локальный проект в IDE (например, Intellij IDEA), чтобы напрямую запустить SpringOauthServerApplication.java для доступа. Или настройте Tomcat (или аналогичный сервер сервлетов) и запустите его. Также можно скомпилировать проект в jar-файл с помощью команды maven package (spring-oauth-server.jar), а затем запустить его с помощью команды java -jar. Если вы используете команду java -jar spring-oauth-server.jar, рекомендуется указать файл конфигурации с помощью параметра spring.config.location, например: java -jar spring-oauth-server.jar --spring.config.location=xxx.properties.
- Обратитесь к файлу oauth2.1-flow.md (в каталоге others) для тестирования (также можно получить доступ через браузер, например, http://localhost:8080/).
Параметры конфигурации
В таблице ниже приведены основные переменные в файле конфигурации application.properties.
Параметр |
Обязательный |
Значение по умолчанию |
Описание |
spring.datasource.* |
Да |
- |
Конфигурация подключения к базе данных |
spring.thymeleaf.* |
Да |
- |
Конфигурация Spring MVC thymeleaf |
server.port |
Да |
8080 |
Номер порта службы |
spring.security.oauth2.authorizationserver.issuer |
Да |
- |
Issuer OAuth2, полная внешняя адресная строка для производственной среды |
spring.application.name |
Да |
- |
Имя компонента приложения |
Типы грантов (grant_type)
Описание поддерживаемых типов грантов (grant type) OAuth2.1 и их функций. Авторизационные режимы (или схемы)
- Авторизационный код (authorization code): сначала авторизация через логин, затем получение токена.
- Авторизация с кодом PKCE (PKCE — Proof Key for Code Exchange): авторизация с использованием кода и параметров code_challenge и code_challenge_method. Затем получение токена с параметром code_verifier.
- Пароль (password): передача логина и пароля напрямую для получения токена. OAuth 2.1 не рекомендует использовать этот режим.
- Обновление access token (refresh token): обновление токена доступа.
- Код устройства (device code): используется для аутентификации и авторизации устройств интернета вещей без клавиатуры. Новый в OAuth 2.1.
- Клиентский режим (client credentials): клиент регистрируется у сервера, а затем получает ресурсы от сервера.
- JWT-носитель (jwt-bearer): утверждение (assertion) для повышения безопасности клиентских запросов. Реализуется двусторонний SSL для проверки подписи клиента сервером.
Внимание: по сравнению с OAuth 2.0, исключён неявный режим (implicit).
Помощь и улучшения
Блог проекта: https://blog.csdn.net/monkeyking1987/article/details/16828059.
Если у вас есть вопросы или проблемы при использовании проекта, вы можете обратиться к Wiki проекта и его файлам на Gitee. Автор будет добавлять решения проблем, о которых сообщают пользователи. Если вы не нашли решение в этих источниках, вы также можете отправить письмо на адрес sz@monkeyk.com.
Для сообщений об ошибках и предложений по улучшению проекта вы можете использовать систему отслеживания ошибок проекта. Автор будет следить за проектом и вносить улучшения.
Расширение функций
- Сохранение кода авторизации в базе данных: загрузите файл конфигурации на сайте.
- Изменение времени истечения срока действия токена: загрузите соответствующий файл конфигурации.
- Настройка собственного grant type: измените значение поля authorized_grant_types в таблице oauth_client_details.
- Как обновить access token: после успешной авторизации клиент получает данные, включая access token, refresh token и другие параметры. Чтобы обновить токен, отправьте запрос на сервер с параметрами client_id, client_secret, grant_type и refresh_token. Обратите внимание, что refresh_token должен совпадать с полученным ранее, и grant_type должен быть установлен как refresh_token.
План разработки
С версии 0.3 проект публикует планы развития, чтобы пользователи могли следить за прогрессом. Для управления разработкой используется открытый проект andaily-developer.
Версия 3.0.1 (в планах): добавить поддержку WebAuthn для беспарольной авторизации.
Версия 3.0.0 (завершена): проект завершён 31 октября 2023 года. Обновление базовой системы безопасности:
- обновление JDK до версии 17;
- переход на Spring 6.x и Spring Boot 3.x;
- замена Thymeleaf на сервлеты/JSP.
Полное обновление поддержки протоколов:
- поддержка OAuth2.1 и OIDC1.0.
Изменения в сборке пакета:
- пакет war заменён на jar;
- соответствующие изменения в SQL.
Обновление spring-security-oauth2:
- использование spring-security-oauth2-authorization-server вместо spring-security-oauth2 (подробное объяснение доступно по ссылке).
Улучшение интерфейса:
- дружественный дизайн с использованием OAuth2.1;
- обновление всех подсказок.
Добавление поддержки spring-restdocs:
- автоматическое создание документации по API.
Version: 2.1.1 [отменено]
Date: 2022-05-05 / ---
Попытка обновить spring-security-oauth2, подробное объяснение доступно по ссылке.
Version: 2.1.0 [завершено]
Date: 2020-06-05 / 2022-05-01
-
Обновлены access_token и refresh_token до JWT (Json Web Token):
- повышение производительности.
-
Добавлен гибкий параметр конфигурации sos.reuse.refresh-token:
- позволяет в реальном времени продлевать срок действия токена (аналогично сеансу).
-
Обновлено spring-security oauth2 до версии 2.3.8.RELEASE:
- добавлено spring-security-jwt версии 1.1.1.RELEASE.
Version: 2.0.2 [завершено]
Date: 2019-08-05 / 2020-06-04
- Исправлена уязвимость CVE-2019-3778:
- используется spring-security-oauth 2.3.5.RELEASE.
- Решена проблема с несколькими access_token в базе данных:
- добавлены уникальные ограничения.
- Обновлено Spring-Boot до версии 2.1.4.RELEASE.
Version: 2.0.1 [завершено]
Date: 2018-05-01 / 2019-08-04
- Добавлена функция генерации AccessToken с помощью кода.
- Добавлено сохранение AccessToken в Redis.
- Обновлён Spring Security OAuth до версии 2.3.4.RELEASE.
- Изменена конфигурация ошибки для ROLE.
- Используется Spring-boot 2.0.2.RELEASE.
- Исправлено #IJO9R:
- клиентское поле client_secret не проверяется в интерфейсе /oauth/rest_token.
- Проект представлен в виде видео:
- более наглядное представление.
Version: 2.0.0 [завершено]
Date: 2018-04-09 / 2018-04-21
- Обновлённый интерфейс:
- улучшенное понимание и удобство использования, сценарный подход.
- Переработан с использованием Spring-boot.
Version: 1.1 [отклонено]
Date: 2018-10-14 / ---
Нет информации о изменениях.
Version: 1.0 [завершено]
Date: 2017-03-30 / 2018-04-04
- В тестах implicit клиентский секрет удалён.
- Улучшенный интерфейс:
- лучшее понимание и удобство использования, сценарный подход.
- Добавлен API для удаления access_token.
- Добавлен API для удаления refresh_token.
- Проверен access_token с помощью API /oauth/check_token.
- Устранена проблема #IGNQ9:
- CustomJdbcTokenStore CacheEvict работает корректно. Версия: 0.6 [готово]
Дата: 2016-07-07 / 2016-10-13
-
(150) — изменить OAUTH, чтобы при ошибке возвращался JSON;
-
(151) — добавить поддержку Ehcache для данных;
-
(158) — добавить комментарии в необходимые места кода и конфигурации для удобства понимания;
- добавить документацию по протоколу OIDC.
Версия: 0.5 [готово]
Дата: 2016-02-19 / 2016-05-24
- поддержка java-config (нулевая конфигурация), а также использование новых аннотаций, ветка config;
- OAUTH «token» Restful API;
- User Overview/ user add/archive;
- добавление документа API проекта;
- добавлена ветка MongoDB.
Версия: 0.4 [готово]
Дата: 2015-11-09 / 2015-11-30
- исправление проблемы с пользовательскими access_token_validity и refresh_token_validity (#5);
- обновление spring-security-oauth2 до версии 2.0.6 и выше, текущая версия 1.0.5;
- обновить spring и spring security до версий > 4.0;
- проект добавлен на онлайн-тестовый сервер;
- синхронизировать обновления spring-oauth-client с spring-oauth-server;
- удалить зависимость mybatis;
- обновить JAVA до 1.8; Servlet 3.0;
- в таблице Oauth добавлен индекс.
Версия: 0.3 [готово]
Дата: 2015-05-14 / 2015-06-07
- #73 — обновить версию spring-security-oauth2 до «2.0.6.RELEASE» (текущая: 1.0.5.RELEASE) [ОТМЕНЕНО];
- #74 — в DDL MySQL oauth добавить create_time, значение по умолчанию — now();
- #75 — добавить API информации о пользователе для использования проектом spring-oauth-client;
- #77 — добавить привилегии домена пользователю. Добавить двух начальных пользователей: unityuser (ROLE_UNITY), mobileuser («ROLE_MOBILE). Если пользователь по умолчанию, то вернуть все привилегии, иначе вернуть указанные привилегии;
- #78 — начальный проект sprint-oauth-client (maven), добавить подмодули;
- #91 — заменить зависимость log4j на logback;
- #92 — добавить описание столбцов таблицы базы данных;
- #93 — сохранить default oauth_code в базе данных (в настоящее время хранится в памяти);
- spring-oauth-сервер, добавить Bootstrap CSS;
- #95 — добавить управление client-details; создать/удалить, показать тестовые ссылки. Проектный журнал
2013-11-19 Начальный проект, старт пуш кода
2013-11-20 Релиз 0.1 версии
2015-05-06 Релиз 0.2 версии
2015-05-27 Создание проекта блога, доступ по адресу http://andaily.com/blog/?cat=19
2015-06-07 Релиз 0.3 версии
2015-06-16 Добавление доступа к github: https://github.com/monkeyk/spring-oauth-server,
последующие обновления будут синхронизироваться между github и gitosc.
2015-11-09 Начало разработки 0.4-beta версии
2015-11-18 Релиз 0.4-бета версии
2016-01-02 Релиз 0.4 версии
2016-02-19 Добавление планирования разработки версии 0.5
2016-04-03 Добавление ветки config
2016-04-14 Добавление ветки mongodb
2018-04-21 Использование spring-boot для рефакторинга, добавление реализации 2.0.0 2.0.0
2018-05-01 Начало разработки ветки 2.0.1
2019-07-04 Добавление Redis в ветку config
2019-08-04 Релиз версии 2.0.1
2020-06-04 Релиз версии 2.0.2
2022-05-01 Релиз версии 2.1.0
2023-10-10 Начало новой крупной версии 3.0.0 разработки
2023-10-31 Релиз новой версии 3.0.0
Дополнительные ресурсы
Ниже приведены дополнительные ресурсы о OAuth2, которые были собраны в процессе обучения и могут быть полезны для более глубокого понимания и использования OAuth2.
-
RFC 6749 - The OAuth 2.0 Authorization Framework, OAuth2.0 протокол (на английском языке)
-
OAuth 2.0 — OAuth, официальный сайт OAuth2.0
-
Объяснение основных параметров OAuth2, основное внимание уделяется grant_type и response_type, а также примерам
-
OAuth2 flows, подробное введение в процесс OAuth2 и ответы на различные ошибки
-
Руководство разработчика OAuth 2 (Spring security oauth2), перевод руководства разработчика OAuth 2 (spring security oauth2)
-
Понимание OAuth 2.0, введение в использование различных типов grant_type
-
OAuth2: неявное предоставление (Implicit Grant) типа открытого разрешения, введение в режим grant_type='implicit'
-
Apache Oltu, Java-версия эталонной реализации OAuth2, рекомендуется изучить
**OIDC – основанный на OAuth2 протокол авторизации и аутентификации следующего поколения**
https://andaily.com/blog/?p=440
Конфигурация сохранения AccessToken в Redis в spring-oauth-server
https://andaily.com/blog/?p=19776
Как сгенерировать AccessToken с помощью кода
https://andaily.com/blog/?p=19793
FAQ по различным конфигурациям и сценариям использования access_token и refresh_token в OAuth2
https://andaily.com/blog/?p=19884
Введение в OAuth2.1
https://oauth.net/2.1/
Состояние и основные характеристики OAuth 2.1, личное резюме
https://andaily.com/blog/?p=20004,
Официальный сайт OIDC
https://openid.net/developers/how-connect-works/
Детали обновления SpringSecurity до OAuth2.1/OIDC1.0
https://andaily.com/blog/?p=24223
С остальными пунктами запроса работа не велась, так как они не содержат информации технического характера.
Комментарии ( 0 )