หย่อน #uaa
UAA เป็นบริการจัดการข้อมูลประจำตัวของผู้เช่าหลายราย ซึ่งใช้ใน Cloud Foundry แต่ยังมีให้บริการเป็นเซิร์ฟเวอร์ OAuth2 แบบสแตนด์อโลนอีกด้วย บทบาทหลักคือในฐานะผู้ให้บริการ OAuth2 โดยออกโทเค็นสำหรับแอปพลิเคชันไคลเอ็นต์เพื่อใช้เมื่อดำเนินการในนามของผู้ใช้ Cloud Foundry นอกจากนี้ยังตรวจสอบสิทธิ์ผู้ใช้ด้วยข้อมูลรับรอง Cloud Foundry และทำหน้าที่เป็นบริการ SSO โดยใช้ข้อมูลรับรองเหล่านั้น (หรืออื่นๆ) ได้ มีอุปกรณ์ปลายทางสำหรับจัดการบัญชีผู้ใช้และสำหรับการลงทะเบียนไคลเอนต์ OAuth2 รวมถึงฟังก์ชันการจัดการอื่นๆ มากมาย
บริการตรวจสอบความถูกต้องคือ uaa
มันเป็นเว็บแอป Spring MVC ธรรมดา ปรับใช้ตามปกติใน Tomcat หรือคอนเทนเนอร์ที่คุณเลือก หรือดำเนินการ ./gradlew run
เพื่อรันโดยตรงจากไดเร็กทอรี uaa
ในแผนผังต้นทาง เมื่อรันด้วย gradle มันจะฟังพอร์ต 8080 และ URL คือ http://localhost:8080/uaa
เซิร์ฟเวอร์ UAA รองรับ API ที่กำหนดไว้ในเอกสาร UAA-API สรุป:
จุดสิ้นสุด OAuth2 /oauth/authorize และ /oauth/token
ตำแหน่งข้อมูล /login_info เพื่อให้สามารถสอบถามพร้อมท์การเข้าสู่ระบบที่จำเป็น
ตำแหน่งข้อมูล /check_token เพื่ออนุญาตให้เซิร์ฟเวอร์ทรัพยากรรับข้อมูลเกี่ยวกับโทเค็นการเข้าถึงที่ส่งโดยไคลเอ็นต์ OAuth2
ตำแหน่งข้อมูล /token_key เพื่ออนุญาตให้เซิร์ฟเวอร์ทรัพยากรรับคีย์การตรวจสอบเพื่อตรวจสอบลายเซ็นโทเค็น
ปลายทางการจัดเตรียมผู้ใช้ SCIM
OpenID เชื่อมต่อจุดสิ้นสุดเพื่อรองรับการรับรองความถูกต้อง /userinfo รองรับ OpenID บางส่วน
การรับรองความถูกต้องสามารถทำได้โดยไคลเอนต์บรรทัดคำสั่งโดยการส่งข้อมูลรับรองโดยตรงไปยังจุดสิ้นสุด /oauth/authorize
(ตามที่อธิบายไว้ในเอกสาร UAA-API) มี ImplicitAccessTokenProvider
ใน Spring Security OAuth ที่สามารถทำงานหนักได้หากไคลเอนต์ของคุณเป็น Java
ตรวจสอบสิทธิ์
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
แอปทั้งหมดทำงานร่วมกับแอปที่ทำงานบนพอร์ตเดียวกัน (8080) เช่น /uaa
, /app
และ /api
UAA จะเข้าสู่ไฟล์ชื่อ uaa.log
ซึ่งสามารถพบได้โดยใช้คำสั่งต่อไปนี้:-
$ sudo lsof | grep uaa.log
ซึ่งคุณควรพบภายใต้บางสิ่งเช่น: -
$TMPDIR/cargo/conf/logs/
ขั้นแรกให้รันเซิร์ฟเวอร์ UAA ตามที่อธิบายไว้ข้างต้น:
$ ./gradlew run
จากเทอร์มินัลอื่น คุณสามารถใช้ curl เพื่อตรวจสอบว่า UAA ได้เริ่มต้นแล้วโดยการขอข้อมูลระบบ:
$ curl --silent --show-error --head localhost:8080/uaa/login | head -1
HTTP/1.1 200
สำหรับคำขอที่ซับซ้อน จะสะดวกกว่าในการโต้ตอบกับ UAA โดยใช้ uaac
ซึ่งเป็นไคลเอนต์บรรทัดคำสั่ง UAA
หากต้องการโหลดเอเจนต์ JDWP สำหรับการดีบัก UAA jvm ให้สตาร์ทเซิร์ฟเวอร์ดังต่อไปนี้:
./gradlew run -Dxdebug=true
หรือ
./gradlew -Dspring.profiles.active=default,hsqldb,debug run
จากนั้นคุณสามารถแนบดีบักเกอร์ของคุณเข้ากับพอร์ต 5005 ของกระบวนการ jvm
หากต้องการระงับการเริ่มต้นเซิร์ฟเวอร์จนกว่าจะแนบดีบักเกอร์ (มีประโยชน์สำหรับการดีบักโค้ดเริ่มต้น) ให้เริ่มเซิร์ฟเวอร์ดังต่อไปนี้:
./gradlew run -Dxdebugs=true
หรือ
./gradlew -Dspring.profiles.active=default,hsqldb,debugs run
./gradlew run
รันเซิร์ฟเวอร์ UAA ด้วยฐานข้อมูล hsqldb ตามค่าเริ่มต้น
% 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)
คุณสามารถรันการทดสอบการรวมกับนักเทียบท่าได้
$ run-integration-tests.sh <dbtype>
จะสร้างคอนเทนเนอร์นักเทียบท่าที่ใช้ฐานข้อมูล uaa + ldap + โดยที่การทดสอบการรวมจะถูกดำเนินการ
การทดสอบหน่วย uaa เริ่มต้น (./gradlew test integratedTest) ใช้ hsqldb
วิธีรันการทดสอบหน่วยด้วยนักเทียบท่า:
$ run-unit-tests.sh <dbtype>
การทดสอบหน่วย uaa เริ่มต้น ( ./gradlew test
) ใช้ hsqldb
เริ่มต้นด้วยการค้นหาว่าการทดสอบของคุณอยู่ในโครงการ gradle ใด คุณสามารถค้นหาโปรเจ็กต์ทั้งหมดได้ด้วยการรัน
$ ./gradlew projects
หากต้องการรันคลาสการทดสอบเฉพาะ คุณสามารถระบุโมดูลและคลาสการทดสอบได้
$ ./gradlew :<project name>:test --tests <TestClass>.<MethodName>
ในตัวอย่างนี้ กำลังรันเฉพาะการทดสอบ JdbcScimGroupMembershipManagerTests ในโมดูล cloudfoundry-identity-server:
$ ./gradlew :cloudfoundry-identity-server:test
--tests "org.cloudfoundry.identity.uaa.scim.jdbc.JdbcScimGroupMembershipManagerTests"
หรือทำการทดสอบทั้งหมดในชั้นเรียน
$ ./gradlew :<project name>:test --tests <TestClass>
คุณอาจต้องการใช้คำสั่ง gradle แบบเต็มที่ด้านล่างของสคริปต์ scripts/unit-tests.sh
โดยใส่ชื่อโปรเจ็กต์ไว้หน้าคำสั่ง test
และเพิ่มตัวเลือก --tests
$ ./gradlew :clean :assemble -Pversion=${UAA_VERSION}
จริงๆ แล้วมีหลายโปรเจ็กต์ที่นี่ แอปพลิเคชันเซิร์ฟเวอร์ uaa
หลัก ไลบรารีไคลเอ็นต์ และตัวอย่างบางส่วน:
uaa
โครงการ WAR เพื่อการปรับใช้ที่ง่ายดาย
server
โปรเจ็กต์ JAR ที่มีการใช้งาน REST API ของ UAA (รวมถึง SCIM) และ UI
model
โปรเจ็กต์ JAR ที่ใช้โดยทั้งไลบรารีไคลเอ็นต์และเซิร์ฟเวอร์
api
(ตัวอย่าง) เป็นบริการทรัพยากร OAuth2 ซึ่งส่งคืนรายการจำลองของแอปที่ปรับใช้
app
(ตัวอย่าง) คือแอปพลิเคชันผู้ใช้ที่ใช้ทั้งสองอย่างข้างต้น
ในแง่ CloudFoundry
uaa
ให้บริการการตรวจสอบสิทธิ์พร้อมการมอบหมายที่ได้รับอนุญาตสำหรับบริการแบ็กเอนด์และแอป (โดยการออกโทเค็นการเข้าถึง OAuth2)
api
เป็นบริการที่จัดเตรียมทรัพยากรที่แอปพลิเคชันอื่นอาจต้องการเข้าถึงในนามของเจ้าของทรัพยากร (ผู้ใช้ปลายทาง)
app
เป็นเว็บแอปที่ต้องการการลงชื่อเพียงครั้งเดียวและเข้าถึงบริการ api
ในนามของผู้ใช้
ข้อกำหนดเบื้องต้น
การปรับใช้ Kubernetes อยู่ระหว่างการพัฒนา คุณควรคาดหวังการเปลี่ยนแปลงบ่อยครั้ง (และอาจจะพัง) ส่วนนี้จะได้รับการอัปเดตเมื่อมีความคืบหน้ากับชุดคุณลักษณะนี้ ณ ตอนนี้:
ไดเร็กทอรี K8s มีเทมเพลต ytt
ที่สามารถเรนเดอร์และนำไปใช้กับคลัสเตอร์ K8s ได้
ในการพัฒนา 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 เราใช้อิมเมจนักเทียบท่า OpenLdap จากโปรเจ็กต์ Bitnami ของ VMWare
uaa/src/main/resources/uaa.yml
และเปิดใช้งาน LDAP โดยไม่ใส่เครื่องหมายข้อคิดเห็นบรรทัด 7, spring_profiles: ldap,default,hsqldb
docker-compose up
จากไดเร็กทอรี scripts/ldap
scripts/ldap
ตรวจสอบการเชื่อมต่อไปจนถึงการเรียกใช้คอนเทนเนอร์ OpenLdap โดยการเรียกใช้ docker-confirm-ldapquery.sh
./gradlew run
/uaa
และเข้าสู่ระบบด้วยผู้ใช้ LDAP user01
และรหัสผ่าน รหัสผ่าน password1
ใช้คำสั่งด้านล่างเพื่อล้างคอนเทนเนอร์และปริมาตร:
docker-compose down --volumes