Быстрый способ запустить надежный сервер 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. |