פתרון בעיות של שגיאות זמן ריצה בפענוח קוד JWT

הדף הזה רלוונטי ל-Apigee ול-Apigee Hybrid.

לעיון במסמכי התיעוד של Apigee Edge

FailedToDecode

קוד שגיאה

steps.jwt.FailedToDecode

גוף תגובת השגיאה

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

מטרה

השגיאה הזו מתרחשת אם טוקן האינטרנט מסוג JSON‏ (JWT) שצוין ברכיב <Source> של מדיניות Decode JWT (פענוח JWT) הוא פגום, לא חוקי או לא ניתן לפענוח.

‫JWT במבנה תקין צריך לכלול כותרת, מטען ייעודי (payload) וחתימה בפורמט הבא: header.payload.signature. אם חסר רכיב ב-JWT שמועבר למדיניות DecodeJWT, תוצג השגיאה. לדוגמה, אם ב-JWT יש רק payload.signature, אבל חסר header, השגיאה תתרחש.

אבחון

  1. מזהים את המשתנה שצוין ברכיב <Source> של מדיניות Decode JWT. המשתנה הזה צריך להכיל את אסימון ה-JWT.

    הנה דוגמה למדיניות Decode 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://$EXTERNAL_IP/v1/decodeJWT" -H "Authorization: Bearer eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"
    

    כאשר $EXTERNAL_IP היא כתובת ה-IP של מאזן העומסים החיצוני. כתובת ה-IP הזו חשופה לאינטרנט. מידע נוסף זמין במאמר בנושא התאמה אישית של ניתוב הגישה.

    בבדיקה מדוקדקת של ה-JWT עולה שהפורמט שלו הוא payload.signature, שהוא פורמט לא תקין. הפורמט הנדרש של ה-JWT הוא header.payload.signature. כתוצאה מכך, המדיניות Decode JWT נכשלת עם השגיאה :

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

רזולוציה

מוודאים שקובץ ה-JWT שמועבר למדיניות Decode JWT מכיל את כל שלושת האלמנטים, שהוא בפורמט הנכון ושאפשר לפענח אותו.

כדי לתקן את הדוגמה שמוצגת למעלה, אפשר להעביר JWT תקין בפורמט header.payload.signature. אפשר לעשות זאת באמצעות קריאה ל-API באמצעות פקודת cURL באופן הבא:

curl -v "http://$EXTERNAL_IP/v1/decodeJWT" -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"

כאשר $EXTERNAL_IP היא כתובת ה-IP של מאזן העומסים החיצוני. כתובת ה-IP הזו חשופה לאינטרנט. מידע נוסף זמין במאמר בנושא התאמה אישית של ניתוב הגישה.

InvalidToken

קוד שגיאה

steps.jwt.InvalidToken

גוף תגובת השגיאה

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

מטרה

השגיאה הזו מתרחשת אם משתנה הזרימה שצוין ברכיב <Source> של מדיניות Decode JWT הוא:

  • מחוץ להיקף (לא זמין בתהליך הספציפי שבו המדיניות מופעלת) או
  • לא ניתן לפתור (לא מוגדר)

אבחון

  1. מזהים את המשתנה שצוין ברכיב <Source> של מדיניות Decode JWT. המשתנה הזה צריך להכיל את אסימון ה-JWT.

    הנה דוגמה למדיניות Decode JWT:

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

    בדוגמה שלמעלה, כותרת בקשת ההרשאה צריכה להכיל את ה-JWT.

  2. בודקים אם המשתנה שזוהה בשלב 1 מוגדר וזמין בתהליך שבו מופעלת המדיניות Decode JWT.

  3. אם המשתנה הוא:

    • לא רלוונטי (לא זמין בתהליך הספציפי שבו המדיניות מופעלת) או
    • לא ניתן לפתור (לא מוגדר)

    אז זה הגורם לשגיאה.

    בדוגמה של בקשת ה-API שבהמשך, המשתמש לא מעביר את ה-JWT בכותרת של בקשת ההרשאה.

    curl -v "http://$EXTERNAL_IP/v1/decodeJWT"
    

כאשר $EXTERNAL_IP היא כתובת ה-IP של מאזן העומסים החיצוני. כתובת ה-IP הזו חשופה לאינטרנט. מידע נוסף זמין במאמר בנושא התאמה אישית של ניתוב הגישה.

Because the authorization request header is not passed, the Decode JWT policy fails with the error:

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

רזולוציה

צריך לוודא שהמשתנה שאליו מתבצעת ההפניה ברכיב <Source> של מדיניות Decode JWT מוגדר, מכיל JWT תקין (ניתן לפענוח) וזמין בתהליך הספציפי שבו מופעלת מדיניות Decode JWT.

כדי לתקן את הדוגמה שמוצגת למעלה, אפשר להעביר JWT תקין בכותרת ההרשאה של הבקשה. אפשר לעשות זאת באמצעות קריאה ל-API באמצעות פקודת cURL באופן הבא:

curl -v "http://$EXTERNAL_IP/v1/decodeJWT" -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"

כאשר $EXTERNAL_IP היא כתובת ה-IP של מאזן העומסים החיצוני. כתובת ה-IP הזו חשופה לאינטרנט. מידע נוסף זמין במאמר בנושא התאמה אישית של ניתוב הגישה.