ช่วงที่ผ่านมาเขียน 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 จะได้หน้าตาประมาณนี้ Swagger UI 1

Configure Azure AD เพื่อทำ redirect URLs

ในการ integrate กับ Azure AD เราต้องไป configure ใน App Registration –> Authentication ตามนี้ Azure AD Authentication Web Settings คำอธิบาย

  • เพิ่ม 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 จะได้หน้าตาประมาณนี้ Swagger UI 2

ต่อด้วยการ Configure SecurityContext

เพื่อบอก Swagger ให้ใช้ authorization จาก scope resource id ของเราในทุกๆ endpoint ของ API เรา

ปิดท้ายด้วยการ Default ค่า resource id ใน Swagger UI

จะได้ไม่ต้องมาพิมพ์ clientId เอง เลยทำการสร้าง Bean ของ SecurityConfiguration ใน Swagger จากนัั้นก็ใส่ค่า clientId ให้เป็น resourceId

จะได้หน้าตาประมาณนี้ Swagger UI 3

พอกด Authorize ตัว Azure AD ก็จะ authorize และ redirect มาที่ Swagger UI ทีนี้เราก็สามารถ access resource ได้ด้วย id token Swagger UI 4

ไปดูตัวอย่างโค้ด https://github.com/raksit31667/example-spring-order