Nginx
เปิดใช้งานการลงชื่อเข้าใช้เดียว (single sign-on) ที่ใช้ OpenID Connect สำหรับแอปพลิเคชันที่ถูกพร็อกซีโดย NGINX Plus โดยใช้ Casdoor เป็นผู้ให้บริการตัวตน (IdP)
คู่มือนี้อธิบายวิธีการเปิดใช้งานการลงชื่อเข้าใช้เดียว (SSO) สำหรับแอปพลิเคชันที่ถูกพร็อกซีโดย NGINX Plus โซลูชันใช้ OpenID Connect เป็นกลไกการตรวจสอบสิทธิ์ โดยใช้ Casdoor เป็นผู้ให้บริการตัวตน (IdP) และ NGINX Plus เป็นฝ่ายที่พึ่งพา
ดูเพิ่มเติม: คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับการรวม OpenID Connect ของ NGINX Plus ในที่เก็บโครงการ GitHub
ข้อกำหนดเบื้องต้น
คำแนะนำนี้สมมติว่าคุณมีสิ่งต่อไปนี้:
เซิร์ฟเวอร์ Casdoor ที่กำลังทำงาน อ้างอิงถึงเอกสารของ Casdoor สำหรับ การติดตั้งเซิร์ฟเวอร์ และ ลองใช้กับ Docker
การสมัครสมาชิก NGINX Plus และ NGINX Plus R15 หรือใหม่กว่า สำหรับคำแนะนำการติดตั้ง ดูที่ NGINX Plus Admin Guide
โมดูล JavaScript ของ NGINX ซึ่งจำเป็นสำหรับการจัดการการโต้ตอบระหว่าง NGINX Plus และ IdP หลังจากติดตั้ง NGINX Plus แล้ว ติดตั้งโมดูลโดยใช้คำสั่งที่เหมาะสมสำหรับระบบปฏิบัติการของคุณ
สำหรับ Debian และ Ubuntu:
sudo apt install nginx-plus-module-njs
สำหรับ CentOS, RHEL และ Oracle Linux:
sudo yum install nginx-plus-module-njs
คำสั่งต่อไปนี้ควรรวมอยู่ในบริบทการกำหนดค่าระดับสูงสุด ("main") ใน /etc/nginx/nginx.conf เพื่อโหลดโมดูล JavaScript ของ NGINX:
load_module modules/ngx_http_js_module.so;
การกำหนดค่า Casdoor
หมายเหตุ: ขั้นตอนต่อไปนี้สะท้อนถึง GUI ของ Casdoor ณ เวลาที่เผยแพร่ แต่ GUI อาจมีการเปลี่ยนแปลง ใช้คู่มือนี้เป็นแหล่งอ้างอิงและปรับให้เข้ากับ GUI ของ Casdoor ปัจจุบันตามความจำเป็น
เพื่อสร้างไคลเอนต์ Casdoor สำหรับ NGINX Plus ใน GUI ของ Casdoor ให้ทำตามขั้นตอนเหล่านี้:
เข้าสู่ระบบบัญชี Casdoor ของคุณที่ http://your-casdoor-url.com/login/
ในคอลัมน์นำทางด้านบน คลิก Application ในหน้า Application ที่เปิดขึ้น คลิกปุ่ม Add ที่มุมซ้ายบน
ในหน้า Edit Application ที่เปิดขึ้น แก้ไขค่าในช่อง Name และ Display name เป็นชื่อของแอปพลิเคชันที่คุณกำลังเปิดใช้งาน SSO ที่นี่ เรากำลังใช้ NGINX Plus
ในช่อง Redirect URLs พิมพ์ URL ของอินสแตนซ์ NGINX Plus รวมถึงหมายเลขพอร์ต และลงท้ายด้วย /_codexch (ในคู่มือนี้คือ https://your-site-url.com:443/_codexch)
หมายเหตุ:
- สำหรับการผลิต เราขอแนะนำอย่างยิ่งให้คุณใช้ SSL/TLS (พอร์ต 443)
- หมายเลขพอร์ตเป็นสิ่งจำเป็นแม้ว่าคุณจะใช้พอร์ตมาตรฐานสำหรับ HTTP (80) หรือ HTTPS (443)
บันทึกค่าในช่อง Client ID และ Client Secret คุณจะคัดลอกพวกมันเข้าไปในไฟล์การกำหนดค่าของ NGINX Plus ใน ขั้นตอนที่ 4 ของ การกำหนดค่า NGINX Plus
คลิก Roles ในคอลัมน์นำทางด้านบน จากนั้นคลิกปุ่ม Add ที่มุมซ้ายบนของหน้าที่เปิดขึ้น
ในหน้า Add ที่เปิดขึ้น พิมพ์ค่าในช่อง Name และ Display Name (ที่นี่คือ nginx-casdoor-role) และคลิกปุ่ม Save
ในคอลัมน์นำทางด้านบน คลิก Users ในหน้า Users ที่เปิดขึ้น คลิก Edit เพื่อแก้ไขหนึ่งในผู้ใช้ที่มีอยู่หรือคลิกปุ่ม Add ที่มุมซ้ายบนเพื่อสร้างผู้ใช้ใหม่
ในหน้า Add ที่เปิดขึ้น แก้ไขช่อง Name และ Display Name ตามที่คุณต้องการ (ที่นี่คือ user1)
เลือก NGINX Plus ในช่อง Signup application
ในช่อง Managed accounts เลือก NGINX Plus ใน Application และกรอกชื่อผู้ใช้และรหัสผ่าน
กลับไปที่หน้า Roles และคลิก Edit ที่แถว nginx-casdoor-role ในหน้าที่เปิดขึ้นมา ในช่อง Sub users เลือกชื่อผู้ใช้ที่คุณเพิ่งสร้าง (ที่นี่คือ built-in/user1)
การกำหนดค่า NGINX Plus
เพื่อกำหนดค่า NGINX Plus เป็น OpenID Connect relying party ให้ทำตามขั้นตอนเหล่านี้:
เริ่มต้นด้วยการสร้างโคลนของที่เก็บ nginx-openid-connect บน GitHub:
git clone https://github.com/nginxinc/nginx-openid-connect
คัดลอกไฟล์ต่อไปนี้จากโคลนไปยังไดเรกทอรี /etc/nginx/conf.d:
- frontend.conf
- openid_connect.js
- openid_connect.server_conf
- openid_connect_configuration.conf
ดึง URL สำหรับ authorization endpoint, token endpoint และไฟล์ JSON Web Key (JWK) จากการกำหนดค่า Casdoor เปิดเทอร์มินัลและทำการ execute คำสั่ง
curl
ต่อไปนี้ โดย piping ผลลัพธ์ไปยังคำสั่งpython
ที่ระบุเพื่อสร้างรูปแบบการกำหนดค่าที่อ่านได้ เพื่อความกระชับ เราได้ตัดผลลัพธ์ให้แสดงเฉพาะฟิลด์ที่เกี่ยวข้องเท่านั้นcurl http://<casdoor-server-address>/.well-known/openid-configuration | python -m json.tool
{
"authorization_endpoint": "https://<casdoor-server-address>/login/oauth/authorize",
"...":"...",
"token_endpoint": "http://<casdoor-server-address>/api/login/oauth/access_token",
"...":"...",
"jwks_uri": "http://<casdoor-server-address>/.well-known/jwks",
"...":"...",
}เปิดไฟล์ /etc/nginx/conf.d/openid_connect_configuration.conf โดยใช้ตัวแก้ไขข้อความที่คุณชอบ ปรับค่าพารามิเตอร์ "default" สำหรับแต่ละ map directives ด้วยค่าที่ระบุ:
map $host $oidc_authz_endpoint
– ใช้ค่าของauthorization_endpoint
จาก ขั้นตอนที่ 3 (ในคู่มือนี้,https://<casdoor-server-address>/login/oauth/authorize
)map $host $oidc_token_endpoint
– ใช้ค่าของtoken_endpoint
จาก ขั้นตอนที่ 3 (ในคู่มือนี้,http://<casdoor-server-address>/api/login/oauth/access_token
)map $host $oidc_client
– ใช้ค่าในช่อง Client ID จาก ขั้นตอนที่ 4 ของ การกำหนดค่า Casdoormap $host $oidc_client_secret
– ใช้ค่าในช่อง Client Secret จาก ขั้นตอนที่ 2 ของ การกำหนดค่า Casdoormap $host $oidc_hmac_key
– ใช้วลีที่ไม่ซ้ำกัน ยาว และปลอดภัย
กำหนดค่าไฟล์ JWK ตามเวอร์ชันของ NGINX Plus ที่ใช้:
- ใน NGINX Plus R17 และหลังจากนั้น NGINX Plus สามารถอ่านไฟล์ JWK โดยตรงจาก URL ที่ระบุเป็น
jwks_uri
ใน ขั้นตอนที่ 3. ทำการเปลี่ยนแปลงต่อไปนี้ใน /etc/nginx/conf.d/frontend.conf:- Comment out (หรือลบ) คำสั่ง auth_jwt_key_file.
- Uncomment คำสั่ง auth_jwt_key_request. (พารามิเตอร์
/_jwks_uri
หมายถึงค่าของตัวแปร$oidc_jwt_keyfile
ซึ่งจะถูกตั้งค่าในขั้นตอนถัดไป) - อัปเดตพารามิเตอร์ "default" ของคำสั่ง
map $host $oidc_jwt_keyfile
เป็นค่าที่ได้จากฟิลด์jwks_uri
ใน ขั้นตอนที่ 3 (ในคู่มือนี้,http://<casdoor-server-address>/.well-known/jwks
).
- ใน NGINX Plus R16 และก่อนหน้านั้น หรือถ้าต้องการ ไฟล์ JWK ต้องอยู่บนดิสก์ท้องถิ่น ทำตามขั้นตอนเหล่านี้:
- คัดลอกเนื้อหา JSON จากไฟล์ JWK ที่ระบุในฟิลด์
jwks_uri
ใน ขั้นตอนที่ 3 (ในคู่มือนี้,http://<casdoor-server-address>/.well-known/jwks
) ไปยังไฟล์ท้องถิ่น (เช่น,/etc/nginx/my_casdoor_jwk.json
). - ใน /etc/nginx/conf.d/openid_connect_configuration.conf, เปลี่ยนพารามิเตอร์ "default" ของคำสั่ง
map $host $oidc_jwt_keyfile
เป็นเส้นทางของไฟล์ท้องถิ่น
- คัดลอกเนื้อหา JSON จากไฟล์ JWK ที่ระบุในฟิลด์
- ใน NGINX Plus R17 และหลังจากนั้น NGINX Plus สามารถอ่านไฟล์ JWK โดยตรงจาก URL ที่ระบุเป็น
ตรวจสอบให้แน่ใจว่าผู้ใช้ที่ระบุในคำสั่ง user ภายในไฟล์การกำหนดค่าของ NGINX Plus (โดยปกติคือ /etc/nginx/nginx.conf) มีสิทธิ์อ่านไฟล์ JWK
การทดสอบ
เปิดเบราว์เซอร์และป้อนที่อยู่ของอินสแตนซ์ NGINX Plus ของคุณ จากนั้น พยายามเข้าสู่ระบบโดยใช้ข้อมูลประจำตัวของผู้ใช้ที่ได้รับมอบหมายบทบาท NGINX Plus
การแก้ไขปัญหา
โปรดดูที่ส่วน Troubleshooting ในที่เก็บ nginx-openid-connect บน GitHub