Logto x Hasura: ใช้ JWT สำหรับการควบคุมการเข้าถึง
คู่มือฉบับสมบูรณ์นี้อธิบายขั้นตอนที่เกี่ยวข้องกับการรวม Logto กับการควบคุมการเข้าถึงแบบ JWT ของ Hasura เพื่อเพิ่มความปลอดภัยของข้อมูลอย่างมีประสิทธิภาพ
Hasura เป็นเครื่องมือที่สามารถให้ API ที่เหมาะสมกับข้อมูลของคุณได้อย่างรวดเร็ว ทั้ง GraphQL และ REST APIs พิจารณาจากความปลอดภัยของข้อมูล Hasura ยังมีความสามารถในการควบคุมการเข้าถึงให้สมดุลกันในแต่ละ API
โดยทั่วไป ผู้ใช้ Hasura จะใช้บริการการจัดการและการรับรองตัวตนจากภายนอก ซึ่ง Logto เป็นหนึ่งในตัวเลือกที่ได้รับความนิยมอย่างมาก
ในบทความนี้ เราจะสมมติว่าคุณใช้บริการ Hasura อยู่แล้ว เราจะแนะนำวิธีที่จะรวม Hasura และ Logto เพื่อเพิ่มความปลอดภัยของข้อมูลให้สูงสุด หากคุณไม่มีบัญชี Logto ลงทะเบียนและเริ่มใช้งานได้เลย!
เบื้องหลัง
Hasura ใช้ การจัดการสิทธิ์เข้าถึงตามบทบาท ในขณะที่ Logto ใช้มาตรฐาน การควบคุมการเข้าถึงตามบทบาท (RBAC).
ในแบบจำลองของ Logto และแนวปฏิบัติที่ดีที่สุดสำหรับ RBAC เราแนะนำให้ผู้ใช้ใช้ scope
เพื่อสื่อถึงการให้สิทธิ์ที่ละเอียดที่สุด ใช้ role
เป็นชุดของ scope
s สำหรับการดำเนินการแบบชุดอย่างสะดวก และท้ายที่สุดตรวจสอบ scope
(โดยปกติที่ฝั่งผู้ให้บริการทรัพยากร) เพื่อยืนยันว่าผู้ใช้สามารถทำงานที่เจาะจงได้หรือไม่
ใน Hasura role
จะสอดคล้องกับการให้สิทธิ์ที่ละเอียดที่สุด และการตรวจสอบการให้สิทธิ์จะดำเนินการกับ role
s ดังนั้น ในระหว่างการตั้งค่า Logto เราแนะนำให้แมป role
หนึ่งกับ scope
หนึ่งอย่างพอดี วิธีนี้สามารถเชื่อมต่อสิทธิ์ของ Logto และ Hasura เข้าด้วยกันเพื่อหลีกเลี่ยงความสับสนและการใช้ผิดที่
Hasura สามารถรองรับการควบคุมการเข้าถึงด้วย Webhooks หรือ JWT โพสต์บล็อกครั้งก่อนของเราแนะนำวิธีใช้ Webhooks และในส่วนต่อไปนี้ เรา จะอธิบายวิธีใช้การควบคุมการเข้าถึงแบบ JWT ของ Hasura
เริ่มต้น
เริ่มด้วยตัวอย่างง่ายๆ สมมติว่าผู้ใช้มี API สองตัวใน Hasura แล้ว คือ GET /user
และ PATCH /user
ซึ่งสอดคล้องกับสองบทบาท: user:reader
และ user:maintainer
ตามลำดับ
1. สร้างทรัพยากร Hasura API ใน Logto
สร้างทรัพยากร Hasura API ใน Logto
2. สร้างบทบาทตามการตั้งค่า Hasura ใน Logto
เราจำเป็นต้องสร้าง scope
สองตัวสำหรับทรัพยากร Hasura API ท ี่กล่าวถึงในขั้นตอนที่ 1 ได้แก่ read:user
และ maintain:user
แล้วสร้างบทบาทสองบทบาท: user:reader
(ที่มี read:user
scope) และ user:maintainer
(ซึ่งรวมถึง maintain:user
scope) เพื่อสอดคล้องหนึ่งต่อหนึ่งกับบทบาทของ Hasura และมอบหมายบทบาทเหล่านี้ให้แก่ผู้ใช้ Logto ตามที่ต้องการ
3. กำหนดค่า Environment Variable HASURA_GRAPHQL_JWT_SECRET
ของ Hasura เพื่อเปิดใช้โหมด JWT
ด้วยการดูใน ตัวเลือกการตั้งค่า JWT ของ Hasura เราจำเป็นต้องเพิ่มและกำหนดค่า Environment Variable HASURA_GRAPHQL_JWT_SECRET
ก่อนที่เราจะใช้ JWT สำหรับการควบคุมการเข้าถึง
มีหลายตัวเลือกที่สามารถกำหนดค่าได้ แต่ที่นี่เราจะแนะนำกรณีที่ง่ายที่สุด: เพียงแค่ต้องกำหนดค่า jwk_url
ค่านี้สามารถรับได้จากจุดสิ้นสุดการกำหนดค่า OpenID ของ Logto (https://your.logto.domain/oidc/.well-known/openid-configuration)
4. ปรับแต่งข้อเรียกร้องเพิ่มเติมใน User Access Token
ใช้คุณสมบัติ Custom JWT ของ Logto ปรับแต่งตรรกะเพื่อเพิ่มข้อเรียกร้องเพิ่มเติมในโทเค็นการเข้าถึงของผู้ใช้ในรูปแบบ JWT
ปรับแต่งเมธอด getCustomJwtClaims
เพื่อเพิ่มข้อมูลใน JWT ที่ Hasura อาศัยเพื่อดำเนินการควบคุมการเข้าถึง ซึ่งสามารถรวมข้อมูลที่เกี่ยวข้องกับผู้ใช้ที่ได้รับอนุญาตในระหว่างอินสแตนซ์นั้น ๆ รวมถึง role
s ที่พวกเขามีซึ่งสามารถเข้าถึงได้ผ่าน context
เรายังได้กำหนด Environment Variable USER_DEFAULT_ROLE_NAMES
เพื่อหลีกเลี่ยงการแข็งลงในโค้ด
5. ผสานรวม Logto SDK
หลังจากกำหนดค่า Logto และ Hasura แล้ว ผสานรวมแอปพลิเคชันของคุณด้วย Logto SDK ที่นี่เราจะใช้งานตัวอย่าง Next เพื่อดูโทเค็นการเข้าถึงของผู้ใช้ที่ Logto ออกให้หลังจากลงชื่อเข้าใช้
ก่อนอื่นเรามอบบทบาท user:reader
และ user:maintainer
ที่สร้างขึ้นก่อนหน้านี้ให้กับผู้ใช้ จากนั้นเข้าสู่ระบบในฐานะผู้ใช้นั้น
รับโทเค็นการเข้าถึงของผู้ใช้และร้องขอ API ของ Hasura:
ข้อสรุป
ในบทความนี้ เราได้เสนอวิธีการควบคุมการเข้าถึงด้วย JWT อีกวิธีที่สนับสนุนโดย Hasura นอกจาก Webhook
โดยการเปรียบเทียบกระบวนการของ Hasura ในการควบคุมการเข้าถึง Webhook และ JWT เราสามารถเห็นได้ว่าการเชื่อมโยงแบบ Webhook จะส่ง Webhook ไปยัง Logto และรอการตอบกลับในทุกคำขอของ Hasura; ในขณะที่วิธี JWT สามารถใช้ได้อย่างต่อเนื่องจนกว่า JWT จะหมดอายุการใช้งาน
วิธี JWT สามารถลดภาระของเครือข่ายและกำจัดการหน่วงเวลาเครือข่ายที่เกิดจาก Webhooks ในขณะที่วิธี Webhook สามารถซิงโครไนซ์การเปลี่ยนแปลงในสิทธิ์ของผู้ใช้แบบเรียลไทม์
ผู้ใช้สามารถเลือกวิธีที่เหมาะสมตามข้อสรุปเหล่านี้ ร่วมกับการใช้งานจริงในธุรกิจของพวกเขา