ลองเชื่อม Swagger UI กับ Azure Active Directory OAuth
ช่วงที่ผ่านมาเขียน blog เกี่ยวกับ security เลยนึกขึ้นได้ว่าเรามี API documentation ผ่าน Swagger ด้วย ก็เลยจะมาลอง integrate กับ Azure AD OAuth ดูหน่อย
ตัวอย่างนี้จะใช้ API ที่พัฒนาบน Java Spring
ที่มีระบบ authentication / authorization ด้วย OAuth2 ถ้า API ของเรายังไม่มี แนะนำให้ไปดูตามตัวอย่างใน OWASP API Security Part 1 กันก่อน
เริ่มจากลง Dependencies กันก่อน
มี 2 ตัวคือ OAuth2 ซึ่งเกี่ยวกับ security โดยตรง (น่าจะมีกันอยู่แล้ว) และ Springfox framework สำหรับ generate Swagger UI จาก Spring annotations
จากนั้นให้เราสร้าง class ชื่อ SwaggerConfiguration ขึ้นมา
ซึ่งโดยปกติถ้า API เรามี Swagger อยู่แล้ว เราจะต้องมี configuration class ในการสร้าง Docket (เป็น interface หลักในการ configuration ของ Springfox)
เปิด Authorization ใน Swagger ด้วยการเพิ่ม SecurityScheme
จากนั้นรัน application แล้วก็เข้า Swagger ที่ http://localhost:8080/swagger-ui.html
click Authorize จะได้หน้าตาประมาณนี้
Configure Azure AD เพื่อทำ redirect URLs
ในการ integrate กับ Azure AD เราต้องไป configure ใน App Registration –> Authentication ตามนี้ คำอธิบาย
- เพิ่ม url ของ Springfox สำหรับการ redirect ใน browser หลังจากทำ authentication สำเร็จ (https://your-service-host-name.com/webjars/springfox-swagger-ui/oauth2-redirect.html)
- ติ๊กตรง ID tokens ใน Implicit grant เพราะว่า Azure จะให้ token ของ User identity ที่ click Authorize จาก Swagger UI ไม่เกี่ยวกับ Access tokens ที่ client ใช้ในการ access Resource Server ของเรา
- ดังนั้นเราต้องไป grant user คนนั้นให้มี permission ในการ access ด้วย โดยไปที่ Enterprise applications –> your-application-name –> Users and groups (ทำตาม documentation นี้เลยครับ)
- อย่าลืม configure
oauth2AllowImplicitFlow
ใน App Registration -> Manifest ให้เป็นtrue
ด้วยนะครับ (ดูตาม documentation นี้เลย)
Configure Azure AD information ใน API ของเรา
เราต้องการ 2 อย่างคือ resource id (ดูได้จาก application ของ API) และ tenant id
กลับมา Configure SecurityScheme กันต่อ
เพิ่ม implicit grant type และ scope สำหรับการทำ authorization
พอกลับไปที่ Swagger UI จะได้หน้าตาประมาณนี้
ต่อด้วยการ Configure SecurityContext
เพื่อบอก Swagger ให้ใช้ authorization จาก scope resource id ของเราในทุกๆ endpoint ของ API เรา
ปิดท้ายด้วยการ Default ค่า resource id ใน Swagger UI
จะได้ไม่ต้องมาพิมพ์ clientId เอง เลยทำการสร้าง Bean ของ SecurityConfiguration ใน Swagger จากนัั้นก็ใส่ค่า clientId ให้เป็น resourceId
จะได้หน้าตาประมาณนี้
พอกด Authorize ตัว Azure AD ก็จะ authorize และ redirect มาที่ Swagger UI ทีนี้เราก็สามารถ access resource ได้ด้วย id token
ไปดูตัวอย่างโค้ด https://github.com/raksit31667/example-spring-order