การแก้ปัญหาข้อผิดพลาดของรันไทม์ JWT ในการถอดรหัส

คุณกําลังดูเอกสารประกอบของ Apigee Edge
ไปที่เอกสารประกอบของ Apigee X
info

FailedToDecode

รหัสข้อผิดพลาด

steps.jwt.FailedToDecode

เนื้อหาการตอบกลับข้อผิดพลาด

{
  "fault": {
    "faultstring": "Failed to Decode Token: policy({0})",
    "detail": {
       "errorcode": "steps.jwt.FailedToDecode"
     }
  }
}

สาเหตุ

ข้อผิดพลาดนี้เกิดขึ้นหาก JSON Web Token (JWT) ที่ระบุไว้ในองค์ประกอบ <Source> ของนโยบายการถอดรหัส JWT มีรูปแบบไม่ถูกต้อง ไม่ถูกต้อง หรือถอดรหัสไม่ได้

JWT ที่มีโครงสร้างถูกต้องควรมีส่วนหัว เพย์โหลด และลายเซ็นในรูปแบบต่อไปนี้ header.payload.signature หาก JWT ที่ส่งไปยังนโยบาย DecodeJWT ไม่มีส่วนคอมโพเนนต์ คุณจะได้รับข้อผิดพลาด ตัวอย่างเช่น หาก JWT มีเพียง payload.signature แต่ไม่มี header ระบบจะแสดงข้อผิดพลาด

การวินิจฉัย

  1. ระบุตัวแปรที่ระบุไว้ในองค์ประกอบ <Source> ของนโยบายการถอดรหัส JWT ตัวแปรนี้ควรมี JWT

    ตัวอย่างนโยบายการถอดรหัส JWT มีดังนี้

    <DecodeJWT name="JWT-Decode-HS256">
        <DisplayName>JWT Verify HS256</DisplayName>
        <Source>request.header.authorization</Source>
        <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    </DecodeJWT>
    

    ในตัวอย่างข้างต้น JWT ควรอยู่ในส่วนหัวของคำขอการให้สิทธิ์

  2. ตรวจสอบตัวแปรที่ระบุไว้ในขั้นตอนที่ 1 และดูว่า JWT ที่มีนั้นถูกต้องหรือไม่ หาก JWT อินพุตไม่ถูกต้อง แสดงว่านี่คือสาเหตุของข้อผิดพลาด

    ในตัวอย่างคำขอ API ด้านล่าง ระบบจะส่ง JWT อินพุตในส่วนหัวของคำขอการให้สิทธิ์

    curl -v "http://<org>-<env>.apigee.net/v1/decodeJWT" -H "Authorization: Bearer eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"
    

    จากการตรวจสอบ JWT อย่างละเอียดพบว่ามีรูปแบบเป็น payload.signature ซึ่งไม่ถูกต้อง รูปแบบที่ควรจะเป็นสำหรับ JWT คือ header.payload.signature ด้วยเหตุนี้ นโยบายการถอดรหัส JWT จึงดำเนินการไม่สำเร็จโดยมีข้อผิดพลาดดังนี้

    "faultstring": "Failed to Decode Token: policy({0})"
    

ความละเอียด

ตรวจสอบว่า JWT ที่ส่งไปยังนโยบายการถอดรหัส JWT มีองค์ประกอบทั้ง 3 รายการ มีการจัดรูปแบบอย่างถูกต้อง และถอดรหัสได้

หากต้องการแก้ไขตัวอย่างที่แสดงด้านบน คุณสามารถส่ง JWT ที่ถูกต้องซึ่งมีรูปแบบ header.payload.signature ซึ่งทำได้ด้วยการเรียก API โดยใช้คําสั่ง cURL ดังนี้

curl -v "http://<org>-<env>.apigee.net/v1/decodeJWT" -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"

InvalidToken

รหัสข้อผิดพลาด

steps.jwt.InvalidToken

เนื้อหาการตอบกลับข้อผิดพลาด

{
  "fault": {
    "faultstring": "Invalid token: policy({0})",
    "detail": {
      "errorcode": "steps.jwt.InvalidToken"
     }
  }
}

สาเหตุ

ข้อผิดพลาดนี้เกิดขึ้นหากตัวแปรโฟลว์ที่ระบุในองค์ประกอบ <Source> ของนโยบาย JWT ถอดรหัสคือ

  • อยู่นอกขอบเขต (ใช้ไม่ได้ในขั้นตอนที่เจาะจงซึ่งจะมีการบังคับใช้นโยบาย) หรือ
  • ไม่สามารถแก้ไขได้ (ไม่ได้กําหนด)

การวินิจฉัย

  1. ระบุตัวแปรที่ระบุไว้ในองค์ประกอบ <Source> ของนโยบายการถอดรหัส JWT ตัวแปรนี้ควรมี JWT

    ตัวอย่างนโยบายการถอดรหัส JWT มีดังนี้

    <DecodeJWT name="JWT-Decode-HS256">
        <DisplayName>JWT Verify HS256</DisplayName>
        <Source>request.header.authorization</Source>
        <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    </DecodeJWT>
    

    ในตัวอย่างข้างต้น ส่วนหัวคำขอการให้สิทธิ์ควรมี JWT

  2. ตรวจสอบว่าตัวแปรที่ระบุในขั้นตอนที่ 1 ได้รับการกำหนดและพร้อมใช้งานในโฟลว์ที่มีการบังคับใช้นโยบาย JWT ถอดรหัสหรือไม่

  3. หากตัวแปรเป็นค่าใดค่าหนึ่งต่อไปนี้

    • อยู่นอกขอบเขต (ใช้ไม่ได้ในขั้นตอนที่เจาะจงซึ่งจะมีการบังคับใช้นโยบาย) หรือ
    • ไม่สามารถแก้ไขได้ (ไม่ได้กําหนด)

    นั่นคือสาเหตุของข้อผิดพลาด

    ในตัวอย่างคำขอ API ด้านล่าง ผู้ใช้ไม่ได้ส่ง JWT ในส่วนหัวคำขอการให้สิทธิ์

    curl -v "http://<org>-<env>.apigee.net/v1/decodeJWT"
    

    เนื่องจากไม่ได้ส่งส่วนหัวคำขอการให้สิทธิ์ นโยบายการถอดรหัส JWT จึงดำเนินการไม่สำเร็จโดยมีข้อผิดพลาดดังนี้

    "faultstring": "Invalid token: policy({0})"
    

ความละเอียด

ตรวจสอบว่าได้กำหนดตัวแปรที่อ้างอิงในองค์ประกอบ <Source> ของนโยบาย JWT ถอดรหัสแล้ว มี JWT ที่ถูกต้อง (ถอดรหัสได้) และใช้ได้ในขั้นตอนที่เจาะจงซึ่งกำลังบังคับใช้นโยบาย JWT ถอดรหัส

หากต้องการแก้ไขตัวอย่างที่แสดงด้านบน คุณสามารถส่ง JWT ที่ถูกต้องในส่วนหัวการให้สิทธิ์ของคำขอ ซึ่งทำได้ด้วยการเรียก API โดยใช้คําสั่ง cURL ดังนี้

curl -v "http://<org>-<env>.apigee.net/v1/decodeJWT" -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"