• hasura
  • restful api
  • graphql
  • logto
  • custom jwt
  • access control
  • authorization

Logto x Hasura: ใช้ JWT สำหรับการควบคุมการเข้าถึง

คู่มือฉบับสมบูรณ์นี้อธิบายขั้นตอนที่เกี่ยวข้องกับการรวม Logto กับการควบคุมการเข้าถึงแบบ JWT ของ Hasura เพื่อเพิ่มความปลอดภัยของข้อมูลอย่างมีประสิทธิภาพ

Darcy Ye
Darcy Ye
Developer

Hasura เป็นเครื่องมือที่สามารถให้ API ที่เหมาะสมกับข้อมูลของคุณได้อย่างรวดเร็ว ทั้ง GraphQL และ REST APIs พิจารณาจากความปลอดภัยของข้อมูล Hasura ยังมีความสามารถในการควบคุมการเข้าถึงให้สมดุลกันในแต่ละ API

โดยทั่วไป ผู้ใช้ Hasura จะใช้บริการการจัดการและการรับรองตัวตนจากภายนอก ซึ่ง Logto เป็นหนึ่งในตัวเลือกที่ได้รับความนิยมอย่างมาก

ในบทความนี้ เราจะสมมติว่าคุณใช้บริการ Hasura อยู่แล้ว เราจะแนะนำวิธีที่จะรวม Hasura และ Logto เพื่อเพิ่มความปลอดภัยของข้อมูลให้สูงสุด หากคุณไม่มีบัญชี Logto ลงทะเบียนและเริ่มใช้งานได้เลย!

เบื้องหลัง

Hasura ใช้ การจัดการสิทธิ์เข้าถึงตามบทบาท ในขณะที่ Logto ใช้มาตรฐาน การควบคุมการเข้าถึงตามบทบาท (RBAC).

ในแบบจำลองของ Logto และแนวปฏิบัติที่ดีที่สุดสำหรับ RBAC เราแนะนำให้ผู้ใช้ใช้ scope เพื่อสื่อถึงการให้สิทธิ์ที่ละเอียดที่สุด ใช้ role เป็นชุดของ scopes สำหรับการดำเนินการแบบชุดอย่างสะดวก และท้ายที่สุดตรวจสอบ scope (โดยปกติที่ฝั่งผู้ให้บริการทรัพยากร) เพื่อยืนยันว่าผู้ใช้สามารถทำงานที่เจาะจงได้หรือไม่

ใน Hasura role จะสอดคล้องกับการให้สิทธิ์ที่ละเอียดที่สุด และการตรวจสอบการให้สิทธิ์จะดำเนินการกับ roles ดังนั้น ในระหว่างการตั้งค่า 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

Hasura API

2. สร้างบทบาทตามการตั้งค่า Hasura ใน Logto

เราจำเป็นต้องสร้าง scope สองตัวสำหรับทรัพยากร Hasura API ที่กล่าวถึงในขั้นตอนที่ 1 ได้แก่ read:user และ maintain:user แล้วสร้างบทบาทสองบทบาท: user:reader (ที่มี read:user scope) และ user:maintainer (ซึ่งรวมถึง maintain:user scope) เพื่อสอดคล้องหนึ่งต่อหนึ่งกับบทบาทของ Hasura และมอบหมายบทบาทเหล่านี้ให้แก่ผู้ใช้ Logto ตามที่ต้องการ

Hasura API with scopes

User reader role

User maintainer role

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)

Hasura JWT config

4. ปรับแต่งข้อเรียกร้องเพิ่มเติมใน User Access Token

ใช้คุณสมบัติ Custom JWT ของ Logto ปรับแต่งตรรกะเพื่อเพิ่มข้อเรียกร้องเพิ่มเติมในโทเค็นการเข้าถึงของผู้ใช้ในรูปแบบ JWT

User access token script

ปรับแต่งเมธอด getCustomJwtClaims เพื่อเพิ่มข้อมูลใน JWT ที่ Hasura อาศัยเพื่อดำเนินการควบคุมการเข้าถึง ซึ่งสามารถรวมข้อมูลที่เกี่ยวข้องกับผู้ใช้ที่ได้รับอนุญาตในระหว่างอินสแตนซ์นั้น ๆ รวมถึง roles ที่พวกเขามีซึ่งสามารถเข้าถึงได้ผ่าน context

เรายังได้กำหนด Environment Variable USER_DEFAULT_ROLE_NAMES เพื่อหลีกเลี่ยงการแข็งลงในโค้ด

5. ผสานรวม Logto SDK

หลังจากกำหนดค่า Logto และ Hasura แล้ว ผสานรวมแอปพลิเคชันของคุณด้วย Logto SDK ที่นี่เราจะใช้งานตัวอย่าง Next เพื่อดูโทเค็นการเข้าถึงของผู้ใช้ที่ Logto ออกให้หลังจากลงชื่อเข้าใช้

User with roles

ก่อนอื่นเรามอบบทบาท user:reader และ user:maintainer ที่สร้างขึ้นก่อนหน้านี้ให้กับผู้ใช้ จากนั้นเข้าสู่ระบบในฐานะผู้ใช้นั้น

รับโทเค็นการเข้าถึงของผู้ใช้และร้องขอ API ของ Hasura:

ข้อสรุป

ในบทความนี้ เราได้เสนอวิธีการควบคุมการเข้าถึงด้วย JWT อีกวิธีที่สนับสนุนโดย Hasura นอกจาก Webhook

โดยการเปรียบเทียบกระบวนการของ Hasura ในการควบคุมการเข้าถึง Webhook และ JWT เราสามารถเห็นได้ว่าการเชื่อมโยงแบบ Webhook จะส่ง Webhook ไปยัง Logto และรอการตอบกลับในทุกคำขอของ Hasura; ในขณะที่วิธี JWT สามารถใช้ได้อย่างต่อเนื่องจนกว่า JWT จะหมดอายุการใช้งาน

วิธี JWT สามารถลดภาระของเครือข่ายและกำจัดการหน่วงเวลาเครือข่ายที่เกิดจาก Webhooks ในขณะที่วิธี Webhook สามารถซิงโครไนซ์การเปลี่ยนแปลงในสิทธิ์ของผู้ใช้แบบเรียลไทม์

ผู้ใช้สามารถเลือกวิธีที่เหมาะสมตามข้อสรุปเหล่านี้ ร่วมกับการใช้งานจริงในธุรกิจของพวกเขา