• invalid_grant
  • invalid grant error
  • oidc grant
  • oauth
  • auth
  • authentication

สำรวจการให้สิทธิ์ OIDC: ทำความเข้าใจและแก้ปัญหาข้อผิดพลาด "invalid_grant"

เรียนรู้พื้นฐานของการให้สิทธิ์ OpenID Connect (OIDC) และวิธีแก้ปัญหาข้อผิดพลาด "invalid_grant"

Charles
Charles
Developer

พื้นหลัง

ในชุมชนของเรา เรามักจะได้ยินคำถามซ้ำ ๆ จากผู้ใช้ของเรา: เกิดอะไรขึ้นกับข้อผิดพลาด "invalid_grant" ใน Logto? เช่น #503

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

ตอนนี้เรามาสำรวจพื้นฐานของการให้สิทธิ์ OIDC กันเถอะ

การให้สิทธิ์ OIDC อธิบาย

ตามที่เราได้แนะนำใน โพสต์บล็อก ก่อนหน้านี้ OpenID Connect (OIDC) เป็นโปรโตคอลที่สร้างขึ้นบน OAuth 2.0

ในบริบทของ OIDC หรือ OAuth2 grant คือชุดของสิทธิ์ที่เจ้าของทรัพยากร (โดยปกติคือผู้ใช้) มอบหมายให้กับแอปพลิเคชันไคลเอนต์ สิทธิ์การเข้าถึงมีความสำคัญสำหรับแอปพลิเคชันไคลเอนต์ในการเข้าถึงข้อมูลประจำตัวของผู้ใช้และทรัพยากรคุ้มครองอื่น ๆ OIDC กำหนดหลายประเภทการให้สิทธิ์ แต่ละประเภทเหมาะกับสถานการณ์ที่แตกต่างกันและวิธีที่แอปพลิเคชันได้รับโทเค็นการเข้าถึง

นี่คือการเปรียบเทียบที่จะช่วยให้คุณเข้าใจการให้สิทธิ์ OIDC ได้ดียิ่งขึ้น

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

ในทำนองเดียวกัน เมื่อใช้แอปพลิเคชัน การขอสิทธิ์คือการกระทำที่คุณขอให้เซิร์ฟเวอร์การให้สิทธิ์มอบสิทธิ์ให้คุณเข้าใช้งาน แอปพลิเคชัน และเซิร์ฟเวอร์ การให้สิทธิ์ยืนยันตัวตนของคุณและออก "วีซ่า" (โทเค็นการเข้าถึง) เพื่อให้คุณลงชื่อเข้าใช้งานแอปพลิเคชันได้

ประเภทการให้สิทธิ์ OIDC ที่ใช้บ่อย:

  1. การให้สิทธิ์โดยใช้รหัสการให้สิทธิ์: นี่คือประเภทการให้สิทธิ์ที่ใช้บ่อยที่สุดใน OIDC มันเกี่ยวข้องกับการเปลี่ยนเส้นทางผู้ใช้ไปยังเซิร์ฟเวอร์การให้สิทธิ์ รับรหัสการให้สิทธิ์ เปลี่ยนเส้นทางกลับไปยังแอปพลิเคชันและแลกเปลี่ยนรหัสเพื่อโทเค็นการเข้าถึง คิดเหมือนเป็นกระบวนการมาตรฐานของการสมัครวีซ่าจากสถานทูตก่อนเข้าสู่ประเทศต่างประเทศ
  2. การให้สิทธิ์โดยใช้โทเค็นรีเฟรช: ใน OIDC ประเภทการให้สิทธิ์นี้อนุญาตให้แอปพลิเคชันไคลเอนต์ได้รับโทเค็นการเข้าถึงใหม่โดยใช้โทเค็นรีเฟรชที่เคยออกมาแล้ว มันมักใช้เพื่อขยายเซสชั่นของผู้ใช้โดยไม่จำเป็นต้องให้พวกเขาป้อนข้อมูลประจำตัวซ้ำอีก จินตนาการว่าคุณมีบัตรวิเศษที่อนุญาตให้คุณขยายระยะเวลาการอยู่ในประเทศต่างประเทศโดยไม่ต้องผ่านการตรวจคนเข้าเมืองอีกครั้ง
  3. การให้สิทธิ์โดยใช้สิทธิ์อนุมัติทันที: ประเภทการให้สิทธิ์นี้ใช้สำหรับแอปพลิเคชันเบราว์เซอร์แบบดั้งเดิมและมีความปลอดภัยน้อยกว่า การให้สิทธิ์โดยใช้รหัสการให้สิทธิ์ จะส่งคืนโทเค็นการเข้าถึงโดยตรงไปยังแอปพลิเคชันไคลเอนต์ มันทำงานเหมือน "วีซ่าเมื่อมาถึง" เพราะไม่จำเป็นต้องยื่นคำร้องขอล่วงหน้า
  4. การให้สิทธิ์โดยใช้ข้อมูลประจำตัวของไคลเอนต์: เหมาะสำหรับการสื่อสารระหว่างเซิร์ฟเวอร์กับเซิร์ฟเวอร์ ประเภทการให้สิทธิ์นี้อนุญาตให้แอปพลิเคชันไคลเอนต์สามารถยืนยันตัวตนโดยตรงกับเซิร์ฟเวอร์การให้สิทธิ์โดยใช้ข้อมูลประจำตัวของตนเอง (ไอดีของไคลเอนต์และความลับของไคลเอนต์) มันเหมือนกับการที่เจ้าหน้าที่พิเศษแสดงตราพิเศษเพื่อเข้าสู่ประเทศโดยไม่ต้องผ่านกระบวนการสมัครวีซ่า

โมเดลออบเจ็กต์การให้สิทธิ์:

ใน Logto การให้สิทธิ์ถูกเก็บในฐานข้อมูลเป็นออบเจ็กต์เอนติตี้ ซึ่งมีข้อมูลเช่น ID บัญชีผู้ใช้ ID ของแอปพลิเคชัน ทรัพยากร OIDC ที่เกี่ยวข้องและขอบเขต เวลาหมดอายุ และอื่น ๆ แต่ละการให้สิทธิ์และการให้สิทธิ์รีเฟรชจะผูกพันกับออบเจ็กต์การให้สิทธิ์เฉพาะ

การขอการให้สิทธิ์:

คำขอ HTTP ที่ส่งไปยังเซิร์ฟเวอร์การให้สิทธิ์ผ่าน API แอปพลิเคชันไคลเอนต์สามารถส่งคำขอการให้สิทธิ์ไปยังจุดสิ้นสุดโทเค็น OIDC เพื่อวัตถุประสงค์ต่าง ๆ รวมถึงการขอการให้สิทธิ์ใหม่ (เช่น ลงชื่อเข้าใช้และได้รับการให้สิทธิ์รีเฟรชและการให้สิทธิ์เข้าถึง) อัปเดตรายละเอียดการให้สิทธิ์ (เช่น การแลกเปลี่ยนการให้สิทธิ์รีเฟรชเป็นการให้สิทธิ์เข้าถึงใหม่) หรือยกเลิกการให้สิทธิ์ (เช่น ยกเลิกโทเค็นที่ออกให้กับผู้ใช้ที่ลงชื่อเข้าใช้และหยุดการเข้าถึงของพวกเขา)

คำขอ Authorization Code Grant ทั่วไปดูดังนี้:

ทำความเข้าใจข้อผิดพลาด "invalid_grant"

เจอข้อผิดพลาด invalid_grant ใน OIDC โดยปกติจะบ่งชี้ว่าประเภทการให้สิทธิ์หรือข้อมูลที่เกี่ยวข้องกับคำขอการให้สิทธิ์ไม่ถูกต้องหรือไม่รองรับ นี่คือบางสาเหตุทั่วไปที่ทำให้เกิดข้อผิดพลาดนี้:

  1. ประเภทการให้สิทธิ์ผิด: การใช้ประเภทการให้สิทธิ์ที่ผิดสำหรับแอปพลิเคชันของคุณอาจส่งผลให้เกิดข้อผิดพลาด invalid_grant ตรวจสอบให้แน่ใจว่าคุณใช้ประเภทการให้สิทธิ์ที่เหมาะสมโดยใช้ SDKs ของ Logto
  2. URI การเปลี่ยนเส้นทางไม่ตรงกัน: เมื่อทำการแลกเปลี่ยนรหัสการให้สิทธิ์สำหรับโทเค็น URI การเปลี่ยนเส้นทางที่ใช้ในคำขอต้องตรงกับที่ใช้ในคำขอการให้สิทธิ์ครั้งแรก ความไม่ตรงกันอาจส่งผลให้เกิดข้อผิดพลาด invalid_grant
  3. รหัสการให้สิทธิ์หมดอายุหรือถูกใช้: ในกระบวนการลงชื่อเข้าด้วยรหัสการให้สิทธิ์ รหัสการให้สิทธิมีอายุการใช้งานจำกัดและจะถูกทำเครื่องหมายว่า "ถูกใช้" เมื่อใช้เพื่อรับโทเค็น การพยายามแลกเปลี่ยนรหัสที่หมดอายุหรือถูกใช้แล้วสำหรับโทเค็นการเข้าถึงจะส่งผลให้เกิดข้อผิดพลาด invalid_grant
  4. โทเค็นรีเฟรชหมดอายุหรือหมุน: เมื่อแลกเปลี่ยนโทเค็นรีเฟรชสำหรับโทเค็นการเข้าถึง ข้อผิดพลาด invalid_grant เกิดขึ้นหากโทเค็นรีเฟรชหมดอายุแล้ว นอกจากนี้เพื่อเพิ่มความปลอดภัย Logto เปิดใช้งาน การหมุนโทเค็นรีเฟรช โดยค่าเริ่มต้น การร้องขอจุดสิ้นสุดโทเค็นด้วยโทเค็นรีเฟรชเดียวกันเป็นครั้งที่สองถือเป็นการใช้โทเค็นรีเฟรช "หมุน" และจะถูกปฏิเสธ
  5. ข้อมูลหรือหัวข้อคำขอที่จำเป็นขาดไป: เมื่อใช้คำขอการให้สิทธิ์ พารามิเตอร์ที่จำเป็นและหัวข้อคำขอต้องได้รับสำหรับประเภทการให้สิทธิ์ที่กำหนด อย่างเช่น ไอดีของไคลเอนต์ต้องได้รับในทุกคำขอการให้สิทธิ์ และไอดีของไคลเอนต์และความลับของไคลเอนต์ต้องได้รับสำหรับ การให้สิทธิ์ข้อมูลประจำตัวของไคลเอนต์ สามารถลดความเสี่ยงนี้ได้โดยการใช้ SDKs ของ Logto
  6. เหตุผลอื่น ๆ: ข้อผิดพลาดนี้ยังสามารถเกิดขึ้นได้เนื่องจากเหตุผลเช่น ข้อมูลประจำตัวของไคลเอนต์ไม่ตรงกัน การให้สิทธิ์หมดอายุหรือไม่พบ โทเค็นรีเฟรชไม่พบ เป็นต้น

การแก้ปัญหา

เคล็ดลับในการแก้ปัญหาข้อผิดพลาด "invalid_grant" อย่างมีประสิทธิภาพ:

  1. ใช้ Logto client SDK เสมอเพื่อรวม Logto เข้าไปในแอปพลิเคชันของคุณ เพื่อให้แน่ใจว่าคำขอการให้สิทธิ์กำลังถูกทำไปยังจุดสิ้นสุดที่เกี่ยวข้องและโดยใช้ข้อมูลที่ถูกต้อง
  2. ตรวจสอบให้แน่ใจว่าข้อมูลประจำตัวแอปของคุณและ URIs การเปลี่ยนเส้นทางตรงกับการกำหนดค่าใน Admin Console
  3. หลีกเลี่ยงการทำคำขอซ้ำ ๆ โดยเฉพาะสำหรับ SPAs เช่น React และ Vue ที่คอมโพเนนต์ของหน้าสามารถเรนเดอร์ใหม่ได้เนื่องจากการเปลี่ยนแปลงของการพึ่งพา ตรวจสอบให้แน่ใจว่าฟังก์ชั่นที่ใช้ในการแลกเปลี่ยนรหัสหรือโทเค็นรีเฟรชสำหรับโทเค็นการเข้าถึงไม่ได้ถูกเปิดใช้งาน หลายครั้งด้วยพารามิเตอร์คำขอเดียวกัน นี่เป็นความผิดพลาดที่ผู้ใช้บางคนของเรามักจะทำ โดยปกติถ้าคุณเห็นคำขอ "token" หลายครั้งในคอนโซลการดีบักของคุณ ครั้งแรกมักจะสำเร็จแต่ครั้งถัดไปทั้งหมดล้มเหลว ตรวจสอบพารามิเตอร์คำขอเพื่อดูว่าพวกมันกำลังใช้ "code" หรือ "refresh token" เดียวกันหรือไม่ จำไว้ว่าคุณสามารถใช้โค้ดและโทเค็นรีเฟรชได้เพียงครั้งเดียวในคำขอการให้สิทธิ์
  4. ตรวจสอบเวลาหมดอายุ ตัวอย่างเช่น ถ้าโทเค็นรีเฟรชของคุณหมดอายุ (โดยค่าเริ่มต้น 14 วัน) และคุณได้รับข้อผิดพลาด invalid_grant คุณควรจัดการอย่างถูกต้องโดยการเริ่มกระบวนการลงชื่อเข้าใช้ของผู้ใช้อีกครั้ง ถ้าคุณกำลังใช้ Logto SDK คุณสามารถเรียกฟังก์ชั่น signIn() อีกครั้งเพื่อเปลี่ยนเส้นทางผู้ใช้ของคุณกลับไปยังหน้าลงชื่อเข้าใช้
  5. ตรวจสอบบันทึกการตรวจสอบ ไปยัง Admin Console → Audit Logs ค้นหาบันทึกข้อผิดพลาดที่เกี่ยวข้องกับเหตุการณ์และตรวจสอบรายการความผิดพลาดโดยละเอียด โดยปกติจะมีเหตุผลเฉพาะเจาะจงมากกว่าในเส้นทางของความผิดพลาดที่อยู่เบื้องหลังข้อผิดพลาด invalid_grant เช่น "ไม่พบการให้สิทธิ์" หรือ "โทเค็นรีเฟรชหมดอายุ"

หมายเหตุปิด

ข้อผิดพลาด invalid_grant สามารถท้าทายและสับสนสำหรับผู้เริ่มต้น แต่ด้วยความเข้าใจที่ชัดเจนเกี่ยวกับการให้สิทธิ์ OIDC และความสนใจในรายละเอียด คุณสามารถระบุและจัดการปัญหาด้วยตัวคุณเองได้ เข้าร่วมการสนทนาของเราใน Discord หรือ GitHub และบอกเราหากบล็อกนี้ช่วยทำให้ความสับสนเกิดความกระจ่างและระบุปัญหาที่คุณกำลังเผชิญได้ ทีมพัฒนาของ Logto ยินดีที่จะช่วยเหลือคุณเสมอ

มาร่วมกันสร้างประสบการณ์การยืนยันตนอย่างราบรื่นและปลอดภัยสำหรับแอปพลิเคชันของคุณที่คุณรัก