Working with Azure Episode 2: Secure your Spring boot application with Oauth2 + Azure Active Directory (Part 2: Authorization)
Introduction
ต่อจากตอนที่แล้ว Working with Azure Episode 1: Secure your Spring boot application with Oauth2 + Azure Active Directory (Part 1: Authentication) เราได้ทำการตรวจสอบ identity ของ client เพื่อเช็คว่าเรารู้จักคนๆนี้หรือเปล่า เมื่อเรา verify แล้วว่าคนนี้เป็น client ที่เรารู้จักถูกต้อง เราก็ต้องดูว่าเขามีสิทธิที่จะเข้าถึงข้อมูลของ endpoint นี้หรือเปล่าหรือเรียกว่า Authorization มาดูกันว่าจะเราจะสามารถใช้ AzureAD เพื่อตรวจสอบสิทธิของ client ได้อย่างไร
Authorization
การ Authorization คือการที่เรา check ว่า client นั้นมี permission/role ที่จะเข้าถึงข้อมูลของ Endpoint นั้นๆหรือเปล่า ยกตัวอย่างง่ายๆ เช่น เวลาที่เราไปดู concert เราจะต้องแสดงตั๋วที่เราซื้อมาเพื่อยืนยันว่าเรามีสิทธิที่จะเข้าไปร่วม concert นั่นเอง ตั๋วที่เราแสดงก็เป็นตัวแทนของ role นั่นเองซึ่งโดยปรกติแล้วจะเป็นส่วนหนึ่งของ JWT token ที่เราได้มาจาก authorization server ดังภาพด้านล่าง
Application Role
ก่อนอื่นเลยเราต้องกำหนดก่อนว่า application ของเราจะมี role อะไรบ้างที่เราสามารถ grant ให้ client ของเราเพื่อเข้า endpoint นั้นๆได้
เราจะทำการสร้าง role ที่ชื่อ Reader โดยเข้าไปที่ resource application ของเราใน AzureAD -> Manifest แล้วสร้าง application role ตามภาพข้างล่างโดย id ของ role นั้น generate มาเป็น UUID
Authorize Your Endpoint
ต่อจากคราวที่แล้วใน class Oauth2Configuration เราจะทำการสร้าง AuthenticationConverter มาเพื่ออ่าน JWT token แล้วทำการ extract claim ที่ชื่อ roles ออกมาเพื่อสร้าง GrantedAuthority ซึ่งจะโดนนำไปใช้เพื่อยืนยันสิทธิของ client
จากนั้นทำการเพิ่ม Annotation บน method azureAD() ใน HelloController หลังจากนี้เมื่อใดที่มี request เข้ามาที่ endpoint /azured จะต้องผ่านการ Authorize เสมอและเฉพาะ token ที่มี Reader role เท่านั้นที่จะได้รับสิทธิเข้า endpoint นี้
จะเห็นได้ว่าเมื่อเราใช้ Postman ยิงไปที่ /azured ด้วย token เดิมจะไม่สามารถเข้าได้แล้วและจะได้รับ HTTP status 403 Forbidden มาแทนซึ่งหมายความว่าเราไม่มี permission พอที่จะเข้า
Permission Granting
เราจะทำการ grant permission ให้ client นี้มี role Reader เพื่อที่จะสามารถเข้า endpoint /azuread ได้อีกครั้ง
ไปที่ client application -> API permissions -> Add a permission แล้วค้นหาและเลือก resource application ข้างบนที่เราสร้าง role ไว้ จากนั้น check ที่ Reader permission แล้วกด Add Permission
สังเกตว่าเมื่อทำการ add permission แล้วตรง status จะขึ้นว่า Not granted for Default ดังนั้นให้กด Grant admin consent for Default Directory
จะเห็นว่าตรง status นั้นขึ้นเป็นเครื่องหมายติ๊กถูกแล้ว
ทีนี้พอเราใช้ Postman เพื่อ request token อีกรอบเราจะเห็นได้ว่าใน JWT ที่เราได้กลับมาคราวนี้นั้นมี claim ที่ชื่อ role อยู่ และมี role Reader ที่เราทำการ grant ไปข้างต้นอยู่เช่นกัน
เมื่อเรายิง request พร้อม token ใหม่นี้ไปที่ endpoint /azured อีกครั้งจะเห็นได้ว่าเราได้รับการ authorize เรียบร้อยแล้ว
Source Code
Link: https://github.com/NonTechCompany/spring-oauth2-azuread
Contact
Email: chan.suttichujit@gmail.com
GitHub: https://github.com/NonTechCompany
Next Episode
Working with Azure Episode 3: Secure your Spring boot application with Oauth2 + Azure Active Directory (Part 3: Audience Validation)