Это будет серия из трех статей, в которой рассматриваются способы включения единого входа с поставщиком 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, являются их собственными. |