Статьи

Приложения Spring Boot 2 и OAuth 2 — Настройка сервера авторизации

Это будет серия из трех статей, в которой рассматриваются способы включения единого входа с поставщиком OAuth2 для приложений на основе Spring Boot 2 . Я расскажу следующее в этих постах:

1. Способы начальной загрузки OpenID Connect-совместимого сервера авторизации OAuth2 / провайдера OpenID.

2. Устаревший подход Spring Boot / Spring 5 к интеграции с сервером авторизации OAuth2 / провайдером OpenID.

3. Более новый подход Spring Boot 2 / Spring 5 для интеграции с сервером авторизации OAuth2 / провайдером OpenID.

В этом посте будут рассмотрены способы начальной загрузки сервера авторизации OAuth2, совместимого с OpenID Connect, работающего на локальном компьютере.

По сути, этот пост представляет собой перефразировку предыдущего поста, в котором подробно рассказывается о начальной загрузке сервера авторизации OAuth2 с использованием превосходного проекта UAA Cloud Foundry . Со времени моего предыдущего поста произошли некоторые изменения, и я хотел еще раз описать шаги по созданию сервера авторизации с небольшим акцентом на изменениях, чтобы сделать его совместимым с OpenID Connect .

Лучший способ запустить локальную версию надежного сервера авторизации OAuth2 — использовать отличный проект Cloud Foundry UAA .

Шаг 1 : клонировать проект:

1
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">git clone https://github.com/cloudfoundry/uaa</span> git clone https://github.com/cloudfoundry/uaa</span>

Шаг 2 : Генерация пары ключей

UAA может использовать асимметричную пару ключей RSA для подписи и позволить клиентам проверять подпись. У меня есть удобный скрипт, который генерирует пару ключей и генерирует файл конфигурации, который можно использовать для начальной загрузки UAA:

При запуске выполняется конфигурация UAA, которая выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">jwt:</span> JWT:</span>
  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">token:</span> лексем:</span>
     <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">signing-key: |</span> ключ подписи: |</span>
      <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">-----BEGIN RSA PRIVATE KEY-----</span> ----- НАЧАТЬ RSA ЧАСТНЫЙ КЛЮЧ -----</span>
      <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">MIIEpAIBAAKCAQEAuE5Ds...5Nka1vOTnjDgKIfsN</span> MIIEpAIBAAKCAQEAuE5Ds ... 5Nka1vOTnjDgKIfsN</span>
      <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">NTAI25qNNCZOXXnGp71gMWsXcLFq4JDJTovL4/rzPIip/1xU0LjFSw==</span> NTAI25qNNCZOXXnGp71gMWsXcLFq4JDJTovL4 / rzPIip / 1xU0LjFSw ==</span>
      <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">-----END RSA PRIVATE KEY-----</span> ----- END RSA ЧАСТНЫЙ КЛЮЧ -----</span>
     <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">verification-key: |</span> проверочный ключ: |</span>
      <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">-----BEGIN PUBLIC KEY-----</span> ----- НАЧАТЬ ПУБЛИЧНЫЙ КЛЮЧ -----</span>
      <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuE5DsCmjfvWArlCIOL6n</span> MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuE5DsCmjfvWArlCIOL6n</span>
      <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">ZwIDAQAB</span> ZwIDAQAB</span>
      <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">-----END PUBLIC KEY-----</span> ----- КОНЕЦ ОБЩЕСТВЕННОГО КЛЮЧА -----</span>

Шаг 3 : Используйте конфигурацию для запуска сервера UAA:

1
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">UAA_CONFIG_URL=file://$PWD/uaa_config.yml ./gradlew run</span> UAA_CONFIG_URL = file: //$PWD/uaa_config.yml ./gradlew run</span>

Шаг 4 : Проверить

Быстрый способ проверить, запущен ли UAA, — это проверить JWKS_URI, это конечная точка, которая предоставляет набор ключей проверки, которые клиент может использовать для проверки токена. Для UAA это доступно в конечной точке «/ token_keys», с помощью curl или httpie эта конечная точка может быть проверена:

1
2
3
4
5
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">http GET http://localhost:8080/uaa/token_keys</span> http GET http: // localhost: 8080 / uaa / token_keys</span>
 
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"># OR</span> # ИЛИ ЖЕ</span>
 
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">curl http://localhost:8080/uaa/token_keys</span> curl http: // localhost: 8080 / uaa / token_keys</span>

если все настроено нормально, с этой конечной точки ожидается вывод следующей формы:

01
02
03
04
05
06
07
08
09
10
11
12
13
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">{</span> {</span>
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">"keys": [</span> "ключи": [</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">{</span> {</span>
            <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">"alg": "RS256",</span> "alg": "RS256",</span>
            <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">"e": "AQAB",</span> "e": "AQAB",</span>
            <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">"kid": "legacy-token-key",</span> "kid": "legacy-token-key",</span>
            <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">"kty": "RSA",</span> "kty": "RSA",</span>
            <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">"n": "APLeBV3dcUrWuVEXRyFzNaOTeKOLwFjscxbWFGofCkxrp3r0nRbBBb4ElG4qYzmbStg5o-zXAPCOu7Pqy2j4PtC3OxLHWnKsflNOEWTeXhLkPE0IptHPbc6zgVPP3EoiG_umpm0BYeJPZZc-7tA11uU_3NqidY9wnpOgKBuwNmdoyUrjb4fBDoMr_Wk2_sn_mtHSG8HaX8eJ9SbC9xRCJySjJDApOYR_dKjuwpbcM2ITfbTzD9M2J7yOtoJRkFhd1Ug2t_6AA_z47BBws-x9BBfSNbYGsVlDAbe6NK_jUE",</span> "П": "APLeBV3dcUrWuVEXRyFzNaOTeKOLwFjscxbWFGofCkxrp3r0nRbBBb4ElG4qYzmbStg5o-zXAPCOu7Pqy2j4PtC3OxLHWnKsflNOEWTeXhLkPE0IptHPbc6zgVPP3EoiG_umpm0BYeJPZZc-7tA11uU_3NqidY9wnpOgKBuwNmdoyUrjb4fBDoMr_Wk2_sn_mtHSG8HaX8eJ9SbC9xRCJySjJDApOYR_dKjuwpbcM2ITfbTzD9M2J7yOtoJRkFhd1Ug2t_6AA_z47BBws-x9BBfSNbYGsVlDAbe6NK_jUE",</span>
            <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">"use": "sig",</span> "use": "sig",</span>
            <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">"value": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8t4FXd1xSta5URdHIXM1\no5N4o4vAWOxzFtYUah8KTGunevSdFsEFvgSUbipjOZtK2Dmj7NcA8I67s+rLaPg+\n0Lc7Esdacqx+U04RZN5eEuQ8TQim0c9tzrOBU8/cSiIb+6ambQF62glGQWF3VSDa3/oAD/PjsEHCz7H0EF9I1tgaxWUMBt7o0r+N\nQQIDAQAB\n-----END PUBLIC KEY-----"</span> "Значение": «----- BEGIN PUBLIC KEY ----- \ \ nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8t4FXd1xSta5URdHIXM1 no5N4o4vAWOxzFtYUah8KTGunevSdFsEFvgSUbipjOZtK2Dmj7NcA8I67s + rLaPg + \ n0Lc7Esdacqx + U04RZN5eEuQ8TQim0c9tzrOBU8 / cSiIb + 6ambQF62glGQWF3VSDa3 / Oad / PjsEHCz7H0EF9I1tgaxWUMBt7o0r + N \ nQQIDAQAB \ N ----- END PUBLIC KEY -----»</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">]</span> ]</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>

Шаг 5 : Заполните данные

У UAA есть сопутствующее CLI-приложение под названием uaac , доступное здесь . Предполагая, что вы загрузили uaac cli и UAA запустился с портом по умолчанию 8080, давайте начнем с указания uaac на приложение uaa:

1
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">uaac target http://localhost:8080/uaa</span> uaac target http: // localhost: 8080 / uaa</span>

и войдите в него, используя один из постоянных учетных данных клиента (admin / adminsecret):

1
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">uaac token client get admin -s adminsecret</span> клиент токена uaac получает admin -s adminsecret</span>

Теперь, когда клиент вошел в систему, токен можно исследовать с помощью:

1
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">uaac token decode</span> UAAC токен декодировать</span>

который должен отображать детали вошедшего в систему клиента:

01
02
03
04
05
06
07
08
09
10
11
12
13
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">jti: 4457847692b7464ca0320f08271a9e98</span> jti: 4457847692b7464ca0320f08271a9e98</span>
 <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">sub: admin</span> sub: admin</span>
 <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">authorities: clients.read clients.secret clients.write uaa.admin clients.admin scim.write scim.read</span> полномочия: клиенты.читать клиентов.секрет-клиенты.пишите uaa.admin клиентов.админ scim.write</span>
 <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">scope: clients.read clients.secret clients.write uaa.admin clients.admin scim.write scim.read</span> область действия: клиенты.читать клиенты.секрет-клиенты.записать uaa.admin clients.admin scim.write</span>
 <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">client_id: admin</span> client_id: admin</span>
 <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">cid: admin</span> cid: admin</span>
 <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">azp: admin</span> azp: admin</span>
 <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">grant_type: client_credentials</span> grant_type: client_credentials</span>
 <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">rev_sig: 3c12911</span> rev_sig: 3c12911</span>
 <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">iat: 1518332992</span> iat: 1518332992</span>
 <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">exp: 1518376192</span> опыт: 1518376192</span>
 <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">iss: http://localhost:8080/uaa/oauth/token</span> iss: http: // localhost: 8080 / uaa / oauth / token</span>
 <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">zid: uaa</span> зид: ааа</span>

необработанный токен jwt можно получить с помощью следующей команды:

1
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">uaac context</span> UAAC контекст</span>

с выводом, который выглядит так:

01
02
03
04
05
06
07
08
09
10
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">[3]*[http://localhost:8080/uaa]</span> [3] * [HTTP: // локальный: 8080 / UAA]</span>
 <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">skip_ssl_validation: true</span> skip_ssl_validation: true</span>
 
 <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">[2]*[admin]</span> [2] * [админ]</span>
     <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">client_id: admin</span> client_id: admin</span>
     <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">access_token: eyJhbGciOiJSUzI1NiIsImtpZCI6ImxlZ2FjeS10b2tlbi1rZXkiLCJ0eXAiOiJKV1QifQ..ZEcUc4SvuwQYwdE0OeG5-l8Jh1HsP0JFI3aCob8A1zOcGOGjqso4j1-k_Lzm__pGZ702v4_CkoXOBXoqaaRbfVgJybBvOWbWsUZupMVMlEsyaR_j8DWY8utFAIiN2EsQgjG3qLrsf0K8lm0I3_UIEjaNZhSkWSLDLyY9wr_2SRanSf8LkcEJoSTTgDdO0aP8MvwNpDG7iQ2Om1HZEN08Bed1hHj6e1E277d9Kw7gutgCBht5GZDPFnI6Rjn0O5wimgrAa6FEDjdCpR7hy2P5RiOTcTvjj3rXtVJyVcQcxGKymZrY2WOx1mIEzEIAj8NYlw0TLuSVVOiNZ9fKlRiMpw</span> access_token: eyJhbGciOiJSUzI1NiIsImtpZCI6ImxlZ2FjeS10b2tlbi1rZXkiLCJ0eXAiOiJKV1QifQ..ZEcUc4SvuwQYwdE0OeG5-l8Jh1HsP0JFI3aCob8A1zOcGOGjqso4j1-k_Lzm__pGZ702v4_CkoXOBXoqaaRbfVgJybBvOWbWsUZupMVMlEsyaR_j8DWY8utFAIiN2EsQgjG3qLrsf0K8lm0I3_UIEjaNZhSkWSLDLyY9wr_2SRanSf8LkcEJoSTTgDdO0aP8MvwNpDG7iQ2Om1HZEN08Bed1hHj6e1E277d9Kw7gutgCBht5GZDPFnI6Rjn0O5wimgrAa6FEDjdCpR7hy2P5RiOTcTvjj3rXtVJyVcQcxGKymZrY2WOx1mIEzEIAj8NYlw0TLuSVVOiNZ9fKlRiMpw</span>
     <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">token_type: bearer</span> token_type: предъявитель</span>
     <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">expires_in: 43199</span> expires_in: 43199</span>
     <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">scope: clients.read clients.secret clients.write uaa.admin clients.admin scim.write scim.read</span> область действия: клиенты.читать клиенты.секрет-клиенты.записать uaa.admin clients.admin scim.write</span>
     <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">jti: 4457847692b7464ca0320f08271a9e98</span> jti: 4457847692b7464ca0320f08271a9e98</span>

Наконец, чтобы добавить клиента с кредитами client1 / client1 и пользователя с кредитами user1 / user1:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">uaac client add client1 \</span> uaac клиент добавить client1 \</span>
   <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">--name client1 \</span> --name client1 \</span>
   <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">--scope resource.read,resource.write,openid \</span> --scope resource.read, resource.write, openid \</span>
   <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">-s client1 \</span> -s клиент1 \</span>
   <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">--authorized_grant_types authorization_code,refresh_token,client_credentials,password \</span> --authorized_grant_types authorization_code, refresh_token, client_credentials, пароль \</span>
   <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">--authorities uaa.resource \</span> --authorities uaa.resource \</span>
   <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">--redirect_uri http://localhost:8888/**</span> --redirect_uri http: // localhost: 8888 / **</span>
 
 
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"># Add a user called user1/user1</span> # Добавить пользователя с именем user1 / user1</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">uaac user add user1 -p user1 --emails user1@user1.com</span> uaac user add user1 -p user1 --emails user1@user1.com</span>
 
 
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"># Add two scopes resource.read, resource.write</span> # Добавьте две области действия resource.read, resource.write</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">uaac group add resource.read</span> uaac group добавить resource.read</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">uaac group add resource.write</span> uaac group добавить resource.write</span>
 
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"># Assign user1 both resource.read, resource.write scopes..</span> # Назначьте пользователю user1 оба ресурса: resource.read, resource.write.</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">uaac member add resource.read user1</span> член uaac добавить resource.read user1</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">uaac member add resource.write user1</span> член uaac добавить resource.write user1</span>

На данный момент у нас есть рабочий Сервер авторизации с примером клиента и примером пользователя. В последующих публикациях эти данные будут использоваться для включения аутентификации для приложения Sample Spring Boot2. Я буду обновлять ссылки в этом посте по мере заполнения новых постов.

См. Оригинальную статью здесь: Приложения Spring Boot 2 и OAuth 2 — Настройка сервера авторизации

Мнения, высказанные участниками Java Code Geeks, являются их собственными.