Статьи

Начальная загрузка сервера авторизации OAuth2 с использованием UAA

Быстрый способ запустить надежный сервер OAuth2 на вашем локальном компьютере — использовать отличный проект Cloud Foundry UAA . UAA используется в качестве базового сервера авторизации OAUth2 в развертываниях Cloud Foundry и может масштабироваться, но все еще достаточно мал, чтобы его можно было загружать на небольшом оборудовании.

Я расскажу об использовании UAA в двух постах. В этом посте я расскажу, как запустить локальный сервер UAA, и заполню его некоторыми участниками процесса авторизации OAuth2 — клиентами и пользователями, а в следующем посте я покажу, как использовать этот сервер авторизации. с примером клиентского приложения и в защите ресурса.

Запуск UAA

Репозиторий для проекта UAA находится по адресу https://github.com/cloudfoundry/uaa.

Загрузка проекта проста, просто клонируйте этот репозиторий:

1
git clone https://github.com/cloudfoundry/uaa

Если у вас есть локальный JDK, запустите его, используя:

1
./gradlew run

Эта версия UAA использует базу данных в памяти, поэтому сгенерированные тестовые данные будут потеряны при перезапуске приложения.

Заполните некоторые данные

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

1
uaac target http://localhost:8080/uaa

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

1
uaac token client get admin -s adminsecret

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

1
uaac context

Это будет отображать детали токена, выпущенного UAA, по следующим направлениям:

1
2
3
4
5
6
7
8
9
[3]*[http://localhost:8080/uaa]
 
  [2]*[admin]
      client_id: admin
      access_token: eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJkOTliMjg1MC1iZDQ1LTRlOTctODIyZS03NGE2MmUwN2Y0YzUiLCJzdWIiOiJhZG1pbiIsImF1dGhvcml0aWVzIjpbImNsaWVudHMucmVhZCIsImNsaWVudHMuc2VjcmV0IiwiY2xpZW50cy53cml0ZSIsInVhYS5hZG1pbiIsImNsaWVudHMuYWRtaW4iLCJzY2ltLndyaXRlIiwic2NpbS5yZWFkIl0sInNjb3BlIjpbImNsaWVudHMucmVhZCIsImNsaWVudHMuc2VjcmV0IiwiY2xpZW50cy53cml0ZSIsInVhYS5hZG1pbiIsImNsaWVudHMuYWRtaW4iLCJzY2ltLndyaXRlIiwic2NpbS5yZWFkIl0sImNsaWVudF9pZCI6ImFkbWluIiwiY2lkIjoiYWRtaW4iLCJhenAiOiJhZG1pbiIsImdyYW50X3R5cGUiOiJjbGllbnRfY3JlZGVudGlhbHMiLCJyZXZfc2lnIjoiZTc4YjAyMTMiLCJpYXQiOjE0ODcwMzk3NzYsImV4cCI6MTQ4NzA4Mjk3NiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3VhYS9vYXV0aC90b2tlbiIsInppZCI6InVhYSIsImF1ZCI6WyJhZG1pbiIsImNsaWVudHMiLCJ1YWEiLCJzY2ltIl19.B-RmeIvYttxJOMr_CX1Jsinsr6G_e8dVU-Fv-3Qq1ow
      token_type: bearer
      expires_in: 43199
      scope: clients.read clients.secret clients.write uaa.admin clients.admin scim.write scim.read
      jti: d99b2850-bd45-4e97-822e-74a62e07f4c5

Чтобы увидеть более читаемую и расшифрованную форму токена, просто запустите:

1
uaac token decode

который должен отображать декодированную форму токена:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
jti: d99b2850-bd45-4e97-822e-74a62e07f4c5
  sub: admin
  authorities: clients.read clients.secret clients.write uaa.admin clients.admin scim.write scim.read
  scope: clients.read clients.secret clients.write uaa.admin clients.admin scim.write scim.read
  client_id: admin
  cid: admin
  azp: admin
  grant_type: client_credentials
  rev_sig: e78b0213
  iat: 1487039776
  exp: 1487082976
  iss: http://localhost:8080/uaa/oauth/token
  zid: uaa
  aud: admin clients uaa scim

Теперь, чтобы создать новый клиент (называемый client1), который я буду использовать в следующем посте:

1
2
3
4
5
6
uaac client add client1  \
  --name client1 --scope resource.read,resource.write \
  --autoapprove ".*"  \
  -s client1 \
  --authorized_grant_types authorization_code,refresh_token,client_credentials \
  --authorities uaa.resource

Этот клиент будет запрашивать область действия resource.read, resource.write у пользователей и будет участвовать в потоках OAuth2 типа авторизации code

Создание владельца ресурса или пользователя системы:

1
uaac user add user1 -p user1 --emails user1@user1.com

и назначив этому пользователю область resource.read:

1
2
uaac group add resource.read
uaac member add resource.read user1

Выполните тестовый поток

Теперь, когда у нас есть клиент и владелец ресурса, давайте проведем быстрый поток authorization_code, uaac предоставляет удобный параметр командной строки, который обеспечивает необходимые перехваты перенаправления для захвата кода авторизации и преобразует код auth_code в токен доступа.

1
uaac token authcode get -c client1 -s client1 --no-cf

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

Вход в систему с пользователем user1 / user1, который был создан ранее, должен ответить в командной строке сообщением о том, что токен был успешно извлечен, это можно проверить еще раз, используя следующую команду:

1
uaac context

с выводом, показывая детали вошедшего в систему пользователя !:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
jti: c8ddfdfc-9317-4f16-b3a9-808efa76684b
  nonce: 43c8d9f7d6264fb347ede40c1b7b44ae
  sub: 7fdd9a7e-5b92-42e7-ae75-839e21b932e1
  scope: resource.read
  client_id: client1
  cid: client1
  azp: client1
  grant_type: authorization_code
  user_id: 7fdd9a7e-5b92-42e7-ae75-839e21b932e1
  origin: uaa
  user_name: user1
  email: user1@user1.com
  auth_time: 1487040497
  rev_sig: c107f5c0
  iat: 1487040497
  exp: 1487083697
  iss: http://localhost:8080/uaa/oauth/token
  zid: uaa
  aud: resource client1

На этом завершается вихревая экскурсия по настройке локального UAA и добавлению пары ролей, участвующих в потоке OAuth2 — клиента и пользователя. Я не рассматривал потоки OAuth2 сам по себе, вводная часть Digital Ocean для OAuth2 является очень хорошим учебником по потокам.

Я буду следовать за этим постом с сообщением о том, как эту инфраструктуру можно использовать для защиты примера ресурса и демонстрации потока с использованием Spring Security и Spring Boot.

Ссылка: Начальная загрузка сервера авторизации OAuth2 с использованием UAA от нашего партнера по JCG Биджу Кунджуммена из блога all and sundry.