슬랙 #uaa
UAA는 Cloud Foundry에서 사용되는 다중 테넌트 ID 관리 서비스이지만 독립 실행형 OAuth2 서버로도 사용할 수 있습니다. 기본 역할은 클라이언트 애플리케이션이 Cloud Foundry 사용자를 대신하여 작업할 때 사용할 토큰을 발행하는 OAuth2 제공자입니다. 또한 Cloud Foundry 자격 증명으로 사용자를 인증할 수 있으며 해당 자격 증명(또는 다른 자격 증명)을 사용하여 SSO 서비스 역할을 할 수도 있습니다. 여기에는 사용자 계정 관리, OAuth2 클라이언트 등록을 위한 엔드포인트와 기타 다양한 관리 기능이 있습니다.
인증 서비스는 uaa
입니다. 이는 일반 Spring MVC 웹앱입니다. Tomcat 또는 선택한 컨테이너에서 정상적으로 배포하거나 ./gradlew run
실행하여 소스 트리의 uaa
디렉터리에서 직접 실행합니다. Gradle로 실행하면 포트 8080에서 수신 대기하고 URL은 http://localhost:8080/uaa
입니다.
UAA 서버는 UAA-API 문서에 정의된 API를 지원합니다. 요약하자면:
OAuth2 /oauth/authorize 및 /oauth/token 엔드포인트
필수 로그인 프롬프트에 대한 쿼리를 허용하는 /login_info 엔드포인트
리소스 서버가 OAuth2 클라이언트가 제출한 액세스 토큰에 대한 정보를 얻을 수 있도록 하는 /check_token 엔드포인트.
리소스 서버가 토큰 서명을 확인하기 위해 확인 키를 얻을 수 있도록 하는 /token_key 엔드포인트
SCIM 사용자 프로비저닝 엔드포인트
인증/userinfo를 지원하기 위한 OpenID 연결 엔드포인트. 부분적인 OpenID 지원.
UAA-API 문서에 설명된 대로 /oauth/authorize
끝점에 직접 자격 증명을 제출하여 명령줄 클라이언트에서 인증을 수행할 수 있습니다. 클라이언트가 Java인 경우 무거운 작업을 수행할 수 있는 Spring Security OAuth에는 ImplicitAccessTokenProvider
가 있습니다.
인증하다
GET /login
기본 양식 로그인 인터페이스.
OAuth2 토큰 부여 승인
GET /oauth/authorize?client_id=app&response_type=code...
표준 OAuth2 인증 끝점.
액세스 토큰 얻기
POST /oauth/token
표준 OAuth2 인증 끝점.
요구사항:
이것이 효과가 있다면 당신은 사업을 하고 있는 것입니다:
$ git clone git://github.com/cloudfoundry/uaa.git
$ cd uaa
$ ./gradlew run
앱은 모두 /uaa
, /app
및 /api
와 동일한 포트(8080)에서 실행되는 앱과 함께 작동합니다.
UAA는 다음 명령을 사용하여 찾을 수 있는 uaa.log
라는 파일에 기록합니다.
$ sudo lsof | grep uaa.log
다음과 같은 항목에서 찾을 수 있습니다.-
$TMPDIR/cargo/conf/logs/
먼저 위에서 설명한 대로 UAA 서버를 실행합니다.
$ ./gradlew run
다른 터미널에서는 컬을 사용하여 시스템 정보를 요청하여 UAA가 시작되었는지 확인할 수 있습니다.
$ curl --silent --show-error --head localhost:8080/uaa/login | head -1
HTTP/1.1 200
복잡한 요청의 경우 UAA 명령줄 클라이언트인 uaac
사용하여 UAA와 상호 작용하는 것이 더 편리합니다.
UAA jvm 디버깅을 위한 JDWP 에이전트를 로드하려면 다음과 같이 서버를 시작합니다.
./gradlew run -Dxdebug=true
또는
./gradlew -Dspring.profiles.active=default,hsqldb,debug run
그런 다음 디버거를 jvm 프로세스의 포트 5005에 연결할 수 있습니다.
디버거가 연결될 때까지 서버 시작을 일시 중단하려면(시작 코드 디버깅에 유용함) 다음과 같이 서버를 시작합니다.
./gradlew run -Dxdebugs=true
또는
./gradlew -Dspring.profiles.active=default,hsqldb,debugs run
./gradlew run
기본적으로 hsqldb 데이터베이스를 사용하여 UAA 서버를 실행합니다.
% docker run --name mysql1 -e MYSQL_ROOT_PASSWORD=changeme -d -p3306:3306 mysql
uaa
데이터베이스 생성(예: mysql 대화형 세션에서) % mysql -h 127.0.0.1 -u root -p
...
mysql > create database uaa ;
% ./gradlew -Dspring.profiles.active=mysql,default run
docker run --name postgres1 -p 5432:5432 -e POSTGRES_PASSWORD=mysecretpassword -d postgres
uaa
데이터베이스 생성(예: psql 대화형 세션에서) % psql -h 127.0.0.1 -U postgres
create database uaa;
create user root with superuser password 'changeme';
% ./gradlew -Dspring.profiles.active=postgresql,default run
c uaa
psql (14.5 (Homebrew), server 15.0 (Debian 15.0-1.pgdg110+1))
WARNING: psql major version 14, server major version 15.
Some psql features might not work.
You are now connected to database "uaa" as user "postgres".
d
List of relations
Schema | Name | Type | Owner
--------+-------------------------------+----------+-------
public | authz_approvals | table | root
public | expiring_code_store | table | root
public | external_group_mapping | table | root
public | external_group_mapping_id_seq | sequence | root
public | group_membership | table | root
public | group_membership_id_seq | sequence | root
public | groups | table | root
public | identity_provider | table | root
public | identity_zone | table | root
public | oauth_client_details | table | root
public | oauth_code | table | root
public | oauth_code_id_seq | sequence | root
public | revocable_tokens | table | root
public | schema_version | table | root
public | sec_audit | table | root
public | sec_audit_id_seq | sequence | root
public | spring_session | table | root
public | spring_session_attributes | table | root
public | user_info | table | root
public | users | table | root
(23 rows)
docker를 사용하여 통합 테스트를 실행할 수 있습니다.
$ run-integration-tests.sh <dbtype>
통합 테스트가 실행되는 uaa + ldap + 데이터베이스를 실행하는 도커 컨테이너를 생성합니다.
기본 uaa 단위 테스트(./gradlew test IntegrationTest)는 hsqldb를 사용합니다.
Docker를 사용하여 단위 테스트를 실행하려면 다음 안내를 따르세요.
$ run-unit-tests.sh <dbtype>
기본 uaa 단위 테스트( ./gradlew test
)는 hsqldb를 사용합니다.
테스트가 속한 Gradle 프로젝트를 찾는 것부터 시작하세요. 다음을 실행하여 모든 프로젝트를 찾을 수 있습니다.
$ ./gradlew projects
특정 테스트 클래스를 실행하려면 모듈과 테스트 클래스를 지정할 수 있습니다.
$ ./gradlew :<project name>:test --tests <TestClass>.<MethodName>
이 예에서는 cloudfoundry-identity-server 모듈에서 JdbcScimGroupMembershipManagerTests 테스트만 실행합니다.
$ ./gradlew :cloudfoundry-identity-server:test
--tests "org.cloudfoundry.identity.uaa.scim.jdbc.JdbcScimGroupMembershipManagerTests"
또는 클래스의 모든 테스트를 실행하려면
$ ./gradlew :<project name>:test --tests <TestClass>
test
명령 앞에 프로젝트 이름을 추가하고 --tests
옵션을 추가하여 scripts/unit-tests.sh
스크립트 하단에 있는 전체 gradle 명령을 사용할 수 있습니다.
$ ./gradlew :clean :assemble -Pversion=${UAA_VERSION}
실제로 여기에는 기본 uaa
서버 애플리케이션, 클라이언트 라이브러리 및 일부 샘플 등 여러 프로젝트가 있습니다.
uaa
쉬운 배포를 위한 WAR 프로젝트
UAA의 REST API(SCIM 포함) 및 UI 구현을 포함하는 JAR 프로젝트 server
클라이언트 라이브러리와 서버 모두에서 사용되는 JAR 프로젝트 model
api
(샘플)는 배포된 앱의 모의 목록을 반환하는 OAuth2 리소스 서비스입니다.
app
(샘플)은 위의 두 가지를 모두 사용하는 사용자 애플리케이션입니다.
CloudFoundry 용어로
uaa
인증 서비스와 함께 백엔드 서비스 및 앱에 대한 승인된 위임을 제공합니다(OAuth2 액세스 토큰 발행을 통해).
api
는 리소스 소유자(최종 사용자)를 대신하여 다른 애플리케이션이 액세스하기를 원하는 리소스를 제공하는 서비스입니다.
app
싱글 사인온(SSO)이 필요하고 사용자를 대신하여 api
서비스에 액세스해야 하는 웹앱입니다.
전제 조건
Kubernetes 배포가 활발히 개발 중입니다. 빈번한(그리고 깨질 수도 있는) 변경을 예상해야 합니다. 이 섹션은 이 기능 세트에 대한 진행이 진행됨에 따라 업데이트됩니다. 현재:
K8s 디렉토리에는 K8s 클러스터에 렌더링하고 적용할 수 있는 ytt
템플릿이 포함되어 있습니다.
개발 중에 이 Makefile은 일반적인 렌더링 및 배포 활동에 사용될 수 있습니다.
프로덕션에서는 ytt를 직접 사용하고 싶을 가능성이 높습니다. 다음과 같은 내용이 도움이 될 것입니다.
$ ytt -f templates -f values/default-values.yml | kubectl apply -f -
이러한 값 중 일부를 재정의하려면 YTT의 오버레이 기능을 활용하면 됩니다.
$ ytt -f templates -f values/default-values.yml -f your-dir/production-values.yml | kubectl apply -f -
물론 언제든지 기본값을 모두 버리고 고유한 값 파일을 제공할 수 있습니다.
커뮤니티에 참여할 수 있는 몇 가지 방법은 다음과 같습니다.
요구사항:
UAA 및 LDAP 통합을 디버깅하기 위해 VMWare Bitnami 프로젝트의 OpenLdap 도커 이미지를 사용합니다.
uaa/src/main/resources/uaa.yml
파일을 수정하고 7행의 주석 처리를 제거하여 LDAP를 활성화합니다. spring_profiles: ldap,default,hsqldb
scripts/ldap
디렉토리에서 docker-compose up
실행하세요.scripts/ldap
에서 docker-confirm-ldapquery.sh
실행하여 실행 중인 OpenLdap 컨테이너에 대한 연결을 확인합니다../gradlew run
으로 UAA 시작/uaa
로 이동하여 LDAP 사용자 user01
및 비밀번호 password1
로 로그인합니다.컨테이너와 볼륨을 정리하려면 아래 명령을 사용하십시오.
docker-compose down --volumes