הדף הזה רלוונטי ל-Apigee ול-Apigee Hybrid.
לעיון במסמכי התיעוד של
Apigee Edge
המדיניות VerifyJWT מאמתת JWT חתום או מפענחת ומאמתת JWT מוצפן שהתקבל מלקוחות או ממערכות אחרות. בנוסף, המדיניות הזו מחלצת את הטענות למשתני הקשר, כך שמדיניות או תנאים עוקבים יכולים לבדוק את הערכים האלה כדי לקבל החלטות לגבי הרשאות או ניתוב. מידע מפורט על המדיניות הזו זמין במאמר סקירה כללית של מדיניות בנושא JWS ו-JWT.
כשמפעילים את המדיניות הזו, במקרה של JWT חתום, Apigee מאמת את החתימה של ה-JWT באמצעות מפתח האימות שסופק. במקרה של JWT מוצפן, Apigee מפענח את ה-JWT באמצעות מפתח הפענוח. בכל מקרה, Apigee מאמתת לאחר מכן את ה-JWT בהתאם לזמן התפוגה ולזמן ההתחלה אם הם קיימים. אפשר גם להגדיר במדיניות אימות של ערכים של טענות ספציפיות ב-JWT, כמו הנושא, המנפיק, הקהל או הערך של טענות נוספות.
אם ה-JWT מאומת ותקין, כל הטענות שכלולות ב-JWT מחולצות למשתני הקשר לשימוש במדיניות או בתנאים הבאים, והבקשה מורשית להמשיך. אם אי אפשר לאמת את חתימת ה-JWT או אם ה-JWT לא תקין בגלל אחת מחותמות הזמן, כל העיבוד נפסק ומוחזרת שגיאה בתגובה.
האם המדיניות מאמתת JWT חתום או מוצפן תלוי ברכיב שבו משתמשים כדי לציין את האלגוריתם שמאמת את ה-JWT:
- אם משתמשים ברכיב
<Algorithm>, המדיניות מאמתת JWT חתום. - אם משתמשים ברכיב
<Algorithms>, המדיניות מאמתת JWT מוצפן.
המדיניות הזו היא מדיניות רגילה ואפשר לפרוס אותה בכל סוג של סביבה. מידע על סוגי המדיניות והזמינות שלהם בכל סוג סביבה זמין במאמר סוגי מדיניות.
מידע על החלקים של JWT ועל אופן ההצפנה והחתימה שלהם זמין ב-RFC7519.
אימות של JWT חתום
בקטע הזה מוסבר איך מאמתים אסימון JWT חתום. במקרה של JWT חתום, משתמשים ברכיב <Algorithm> כדי לציין את האלגוריתם לחתימה על המפתח.
דוגמאות ל-JWT חתום
בדוגמאות הבאות אפשר לראות איך מאמתים JWT חתום.
אלגוריתם HS256
מדיניות לדוגמה שמאמתת JWT שנחתם באמצעות אלגוריתם ההצפנה HS256, HMAC באמצעות סיכום ביקורת (checksum) של SHA-256. ה-JWT מועבר בבקשת ה-proxy באמצעות פרמטר טופס בשם jwt. המפתח כלול במשתנה שנקרא private.secretkey.
בדוגמה המלאה שבסרטון שלמעלה מוסבר גם איך לשלוח בקשה בנוגע למדיניות.
הגדרת המדיניות כוללת את המידע ש-Apigee צריך כדי לפענח ולהעריך את ה-JWT, כמו המקום שבו נמצא ה-JWT (במשתנה של זרימת נתונים שצוין ברכיב Source), אלגוריתם החתימה הנדרש, המקום שבו נמצא המפתח הסודי (מאוחסן במשתנה של זרימת נתונים ב-Apigee, שאפשר לאחזר אותו מ-Apigee KVM, למשל) וקבוצה של טענות נדרשות והערכים שלהן.
<VerifyJWT name="JWT-Verify-HS256">
<DisplayName>JWT Verify HS256</DisplayName>
<Algorithm>HS256</Algorithm>
<Source>request.formparam.jwt</Source>
<IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
<SecretKey encoding="base64">
<Value ref="private.secretkey"/>
</SecretKey>
<Subject>monty-pythons-flying-circus</Subject>
<Issuer>urn://apigee-edge-JWT-policy-test</Issuer>
<Audience>fans</Audience>
<AdditionalClaims>
<Claim name="show">And now for something completely different.</Claim>
</AdditionalClaims>
</VerifyJWT>המדיניות כותבת את הפלט שלה למשתני הקשר, כך שמדיניות או תנאים עוקבים ב-proxy ל-API יכולים לבדוק את הערכים האלה. רשימת המשתנים שמוגדרים על ידי המדיניות הזו מופיעה במאמר משתני זרימה.
אלגוריתם RS256
בדוגמה הזו, המדיניות מאמתת JWT שנחתם באמצעות אלגוריתם RS256. כדי לבצע אימות,
צריך לספק את המפתח הציבורי. ה-JWT מועבר בבקשת ה-proxy באמצעות פרמטר טופס בשם jwt. המפתח הציבורי כלול במשתנה שנקרא public.publickey.
בדוגמה המלאה שבסרטון שלמעלה מוסבר גם איך לשלוח בקשה בנוגע למדיניות.
בקטע 'הפניה לרכיב' מפורטות הדרישות והאפשרויות של כל רכיב במדיניות לדוגמה הזו.
<VerifyJWT name="JWT-Verify-RS256">
<Algorithm>RS256</Algorithm>
<Source>request.formparam.jwt</Source>
<IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
<PublicKey>
<Value ref="public.publickey"/>
</PublicKey>
<Subject>apigee-seattle-hatrack-montage</Subject>
<Issuer>urn://apigee-edge-JWT-policy-test</Issuer>
<Audience>urn://c60511c0-12a2-473c-80fd-42528eb65a6a</Audience>
<AdditionalClaims>
<Claim name="show">And now for something completely different.</Claim>
</AdditionalClaims>
</VerifyJWT>בהגדרות שלמעלה, JWT עם הכותרת הזו …
{
"typ" : "JWT",
"alg" : "RS256"
}המטען הייעודי הזה…
{
"sub" : "apigee-seattle-hatrack-montage",
"iss" : "urn://apigee-edge-JWT-policy-test",
"aud" : "urn://c60511c0-12a2-473c-80fd-42528eb65a6a",
"show": "And now for something completely different."
}… ייחשבו כתקפים, אם אפשר לאמת את החתימה באמצעות המפתח הציבורי שסופק.
JWT עם אותה כותרת אבל עם המטען הייעודי (payload) הזה …
{
"sub" : "monty-pythons-flying-circus",
"iss" : "urn://apigee-edge-JWT-policy-test",
"aud" : "urn://c60511c0-12a2-473c-80fd-42528eb65a6a",
"show": "And now for something completely different."
}… ייקבע כלא תקין, גם אם אפשר לאמת את החתימה, כי הטענה sub שכלולה ב-JWT לא תואמת לערך הנדרש של רכיב Subject כפי שמצוין בהגדרת המדיניות.
המדיניות כותבת את הפלט שלה למשתני הקשר, כך שמדיניות או תנאים עוקבים ב-proxy ל-API יכולים לבדוק את הערכים האלה. רשימת המשתנים שמוגדרים על ידי המדיניות הזו מופיעה במאמר משתני זרימה.
בדוגמאות שלמעלה נעשה שימוש ברכיב <Algorithm>, ולכן הן מאמתות JWT חתום. רכיב <PrivateKey> מציין את המפתח שמשמש לחתימה על ה-JWT. יש גם רכיבים חשובים אחרים. האלגוריתם שבו משתמשים תלוי באלגוריתם שצוין בערך של <Algorithm>, כפי שמתואר בקטע הבא.
הגדרת רכיבי המפתח לאימות JWT חתום
הרכיבים הבאים מציינים את המפתח שמשמש לאימות של JWT חתום:
הרכיב שבו משתמשים תלוי באלגוריתם שנבחר, כפי שמוצג בטבלה הבאה:
| אלגוריתם | אלמנטים מרכזיים | |
|---|---|---|
| HS* |
<SecretKey encoding="base16|hex|base64|base64url"> <Value ref="private.secretkey"/> </SecretKey> |
|
| RS*, ES*, PS* | <PublicKey> <Value ref="rsa_public_key_or_value"/> </PublicKey> או: <PublicKey> <Certificate ref="signed_cert_val_ref"/> </PublicKey> או: <PublicKey> <JWKS ref="jwks_val_or_ref"/> </PublicKey> |
|
| *מידע נוסף על דרישות המפתח זמין במאמר מידע על אלגוריתמים להצפנת חתימות. | ||
אימות של JWT מוצפן
בקטע הזה מוסבר איך מאמתים אסימון JWT מוצפן. במקרה של JWT מוצפן, משתמשים ברכיב <Algorithms> כדי לציין את האלגוריתמים לחתימה על המפתח והתוכן.
דוגמה ל-JWT מוצפן
בדוגמה הבאה אפשר לראות איך מאמתים אסימון JWT מוצפן (עם <Type> שמוגדר ל-Encrypted), שבו:
- המפתח מוצפן באמצעות אלגוריתם RSA-OAEP-256.
- התוכן מוצפן באמצעות אלגוריתם A128GCM.
<VerifyJWT name="vjwt-1"> <Algorithms> <Key>RSA-OAEP-256</Key> <Content>A128GCM</Content> </Algorithms> <Type>Encrypted</Type> <PrivateKey> <Value ref="private.rsa_privatekey"/> </PrivateKey> <Subject>subject@example.com</Subject> <Issuer>urn://apigee</Issuer> <AdditionalHeaders> <Claim name="moniker">Harvey</Claim> </AdditionalHeaders> <TimeAllowance>30s</TimeAllowance> <Source>input_var</Source> </VerifyJWT>
בדוגמה שלמעלה נעשה שימוש ברכיב <Algorithms>, ולכן היא מאמתת JWT מוצפן. רכיב <PrivateKey> מציין את המפתח שישמש לפענוח ה-JWT. יש גם רכיבים חשובים אחרים. האלגוריתם שבו משתמשים תלוי באלגוריתם שצוין בערך של <Algorithms>, כפי שמתואר בקטע הבא.
הגדרת רכיבי המפתח לאימות JWT מוצפן
הרכיבים הבאים מציינים את המפתח שמשמש לאימות של JWT מוצפן:
הרכיב שבו משתמשים תלוי באלגוריתם ההצפנה של המפתח שנבחר, כפי שמוצג בטבלה הבאה:
| אלגוריתם | אלמנטים מרכזיים |
|---|---|
| RSA-OAEP-256 | <PrivateKey> <Value ref="private.rsa_privatekey"/> </PrivateKey> הערה: המשתנה שאתם מציינים צריך להיות מפתח פרטי מסוג RSA בפורמט PEM. |
|
<PrivateKey> <Value ref="private.ec_privatekey"/> </PrivateKey> הערה: המשתנה שאתם מציינים צריך להיות מפתח פרטי של עקומה אליפטית בפורמט PEM. |
|
<SecretKey encoding="base16|hex|base64|base64url"> <Value ref="private.flow-variable-name-here"/> </SecretKey> |
|
<PasswordKey> <Value ref="private.password-key"/> <SaltLength> <PBKDF2Iterations> </PasswordKey> |
| dir | <DirectKey> <Value encoding="base16|hex|base64|base64url" ref="private.directkey"/> </DirectKey> |
מידע נוסף על דרישות המפתח מופיע במאמר מידע על אלגוריתמים להצפנת חתימות.
הפניה לרכיב
הפניה למדיניות מתארת את האלמנטים והמאפיינים של מדיניות האימות של JWT.
הערה: ההגדרה תשתנה בהתאם לאלגוריתם ההצפנה שבו אתם משתמשים. בקטע דוגמאות מופיעות דוגמאות שממחישות הגדרות לתרחישי שימוש ספציפיים.
מאפיינים שחלים על רכיב ברמה העליונה
<VerifyJWT name="JWT" continueOnError="false" enabled="true" async="false">
המאפיינים הבאים משותפים לכל רכיבי ההורה של המדיניות.
| מאפיין | תיאור | ברירת מחדל | נוכחות |
|---|---|---|---|
| name |
השם הפנימי של המדיניות. התווים שאפשר להשתמש בהם בשם מוגבלים ל:
A-Z0-9._\-$ %. עם זאת, בממשק המשתמש של Apigee יש הגבלות נוספות, כמו הסרה אוטומטית של תווים שהם לא אלפאנומריים.
אופציונלית, אפשר להשתמש ברכיב |
לא רלוונטי | חובה |
| continueOnError |
מגדירים את הערך false כדי להחזיר שגיאה אם המדיניות נכשלת. זו התנהגות צפויה ברוב המדיניות.
הגדרה ל- |
FALSE | אופציונלי |
| מופעל |
מגדירים את המדיניות למצב true כדי לאכוף אותה.
מגדירים את הערך |
TRUE | אופציונלי |
| אסינכרוני | המאפיין הזה הוצא משימוש. | FALSE | הוצא משימוש |
<DisplayName>
<DisplayName>Policy Display Name</DisplayName>
אפשר להשתמש בו בנוסף למאפיין השם כדי לתת למדיניות תווית בשם אחר בשפה טבעית בכלי לעריכת פרוקסי בממשק הניהול.
| ברירת מחדל | אם לא מציינים את הרכיב הזה, המערכת משתמשת בערך של מאפיין השם של המדיניות. |
| נוכחות | אופציונלי |
| סוג | String |
<Algorithm>
<Algorithm>HS256</Algorithm>
מציין את האלגוריתם הקריפטוגרפי שמשמש לאימות האסימון. משתמשים ברכיב <Algorithm> כדי לאמת JWT חתום.
אלגוריתמים מסוג RS*/PS*/ES* משתמשים בזוג מפתחות ציבורי/סודי, ואלגוריתמים מסוג HS* משתמשים בסוד משותף. אפשר לעיין גם במאמר מידע על אלגוריתמים להצפנת חתימות.
אפשר לציין כמה ערכים ולהפריד ביניהם באמצעות פסיקים. לדוגמה, "HS256, HS512" או "RS256, PS256". עם זאת, אי אפשר לשלב אלגוריתמים של HS* עם אלגוריתמים אחרים, או אלגוריתמים של ES* עם אלגוריתמים אחרים, כי הם דורשים סוג מפתח ספציפי. אפשר לשלב בין אלגוריתמים של RS* ו-PS*.
| ברירת מחדל | לא רלוונטי |
| נוכחות | חובה |
| סוג | מחרוזת של ערכים מופרדים בפסיקים |
| ערכים אפשריים | HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512, PS256, PS384, PS512 |
<Algorithms>
<Algorithms>
<Key>key-algorithm</Key>
<Content>content-algorithm</Content>
</Algorithm>משתמשים ברכיב <Algorithms> כדי לאמת JWT מוצפן. האלמנט הזה מציין את האלגוריתם הקריפטוגרפי להצפנת המפתח שבו השתמשו כשנוצר ה-JWT המוצפן. הוא גם מציין באופן אופציונלי את האלגוריתם להצפנת התוכן.
| ברירת מחדל | לא רלוונטי |
| נוכחות | נדרש, כשמאמתים JWT מוצפן |
| סוג | רמה למתקדמים מאוד |
רכיבי צאצא של <Algorithms>
בטבלה הבאה מופיע תיאור כללי של רכיבי הצאצא של <Algorithms>:
| רכיב צאצא | חובה? | תיאור |
|---|---|---|
<Key> |
חובה | מציינת את אלגוריתם ההצפנה של המפתח. |
<Content> |
אופציונלי | מציינים את אלגוריתם ההצפנה של התוכן. |
האימות ייכשל אם:
- האלגוריתם שצוין במאפיין
algבכותרת של אסימון ה-JWT המוצפן שונה מאלגוריתם הצפנת המפתח שצוין כאן ברכיב<Key>. -
המדיניות מציינת רכיב
<Content>, והאלגוריתם שצוין במאפייןencבכותרת של אסימון ה-JWT המוצפן שונה מזה שצוין ברכיב<Content>.
לדוגמה, כדי לאמת JWT מוצפן ולבדוק שאלגוריתם המפתח הוא RSA-OAEP-256 ואלגוריתם התוכן הוא A128GCM:
<Algorithms>
<Key>RSA-OAEP-256</Key>
<Content>A128GCM</Content>
</Algorithms>לעומת זאת, כדי לאמת JWT מוצפן ולבדוק שאלגוריתם המפתח הוא RSA-OAEP-256, ולא לאכוף אילוץ על אלגוריתם התוכן:
<Algorithms>
<Key>RSA-OAEP-256</Key>
</Algorithms>אלגוריתמים להצפנת מפתחות
בטבלה הבאה מפורטים האלגוריתמים הזמינים להצפנת מפתחות, וגם סוג המפתח שצריך לציין כדי לאמת JWT באמצעות אלגוריתם ההצפנה של המפתח.
הערך של <Key> (אלגוריתם להצפנת מפתחות הצפנה) |
המרכיב העיקרי שנדרש לאימות |
|---|---|
| dir | <DirectKey> |
| RSA-OAEP-256 | <PrivateKey> |
|
<SecretKey> |
|
<PasswordKey> |
|
<PrivateKey> |
במאמר אימות של JWT מוצפן יש דוגמה שבה אלגוריתם הצפנת המפתח הוא RSA-OAEP-256, ולכן משתמשים ברכיב <PrivateKey>.
אלגוריתמים להצפנת תוכן
במדיניות VerifyJWT לא נדרש לציין אלגוריתם להצפנת תוכן. אם רוצים לציין את האלגוריתם שמשמש להצפנת תוכן, צריך לעשות זאת באמצעות האלמנט הבן<Content> של האלמנט<Algorithms>.
ללא קשר לאלגוריתם הצפנת המפתח, האלגוריתמים הבאים – כולם סימטריים ומבוססים על AES – נתמכים להצפנת תוכן:
- A128CBC-HS256
- A192CBC-HS384
- A256CBC-HS512
- A128GCM
- A192GCM
- A256GCM
<Audience>
<Audience>audience-here</Audience> or: <Audience ref='variable-name-here'/>
המדיניות בודקת שהצהרת קהל היעד ב-JWT תואמת לערך שצוין בהגדרה. אם אין התאמה, המדיניות מחזירה שגיאה. ההצהרה הזו מזהה את הנמענים שה-JWT מיועד להם. זוהי אחת מהטענות הרשומות שמוזכרות ב-RFC7519.
| ברירת מחדל | לא רלוונטי |
| נוכחות | אופציונלי |
| סוג | String |
| ערכים אפשריים | משתנה או מחרוזת של זרימת נתונים שמזהים את קהל היעד. |
<AdditionalClaims/Claim>
<AdditionalClaims> <Claim name='claim1'>explicit-value-of-claim-here</Claim> <Claim name='claim2' ref='variable-name-here'/> <Claim name='claim3' ref='variable-name-here' type='boolean'/> </AdditionalClaims> or: <AdditionalClaims ref='claim_payload'/>
הפונקציה מאמתת שמטען ה-JWT מכיל את ההצהרות הנוספות שצוינו, ושערכי ההצהרות שצוינו תואמים.
הצהרה נוספת משתמשת בשם שלא מופיע ברשימת השמות הסטנדרטיים והרשומים של הצהרות JWT. הערך של תביעה נוספת יכול להיות מחרוזת, מספר, ערך בוליאני, מפה או מערך. מיפוי הוא פשוט קבוצה של צמדי שם/ערך. אפשר לציין את הערך של טענה מכל אחד מהסוגים האלה באופן מפורש בהגדרת המדיניות, או באופן עקיף באמצעות הפניה למשתנה של זרימת נתונים.
| ברירת מחדל | לא רלוונטי |
| נוכחות | אופציונלי |
| סוג | מחרוזת, מספר, ערך בוליאני או מפה |
| מערך | מגדירים את הערך true כדי לציין אם הערך הוא מערך של סוגים. ברירת מחדל: false |
| ערכים אפשריים | כל ערך שרוצים להשתמש בו לטענה נוספת. |
רכיב <Claim> מקבל את המאפיינים הבאים:
- name – (חובה) שם התלונה.
- ref – (אופציונלי) השם של משתנה של זרימת נתונים. אם המשתנה הזה קיים, המדיניות תשתמש בערך שלו כמאפיין. אם מציינים גם מאפיין ref וגם ערך הצהרה מפורש, ערך ברירת המחדל הוא הערך המפורש, והמערכת משתמשת בו אם משתנה הזרימה שאליו מתבצעת ההפניה לא נפתר.
- type – (אופציונלי) אחד מהערכים הבאים: string (ברירת מחדל), number, boolean או map
- array – (אופציונלי) מגדירים את הערך true כדי לציין אם הערך הוא מערך של סוגים. ברירת מחדל: false.
כשכוללים את הרכיב <Claim>, שמות הטענות מוגדרים באופן סטטי כשמגדירים את המדיניות. אפשרות אחרת היא להעביר אובייקט JSON כדי לציין את שמות הטענות.
מכיוון שאובייקט ה-JSON מועבר כמשתנה, שמות הטענות נקבעים בזמן הריצה.
לדוגמה:
<AdditionalClaims ref='json_claims'/>
כאשר המשתנה json_claims מכיל אובייקט JSON בפורמט:
{ "sub" : "person@example.com", "iss" : "urn://secure-issuer@example.com", "non-registered-claim" : { "This-is-a-thing" : 817, "https://example.com/foobar" : { "p": 42, "q": false } } }
<AdditionalHeaders/Claim>
<AdditionalHeaders> <Claim name='claim1'>explicit-value-of-claim-here</Claim> <Claim name='claim2' ref='variable-name-here'/> <Claim name='claim3' ref='variable-name-here' type='boolean'/> <Claim name='claim4' ref='variable-name' type='string' array='true'/> </AdditionalHeaders>
הפונקציה מאמתת שכותרת ה-JWT מכילה את צמדי המפתח/ערך הנוספים שצוינו, ושערכי ההצהרות שצוינו תואמים.
הצהרה נוספת משתמשת בשם שלא מופיע בין השמות הסטנדרטיים והרשומים של הצהרות JWT. הערך של טענה נוספת יכול להיות מחרוזת, מספר, ערך בוליאני, מפה או מערך. מיפוי הוא פשוט קבוצה של צמדי שם/ערך. אפשר לציין את הערך של טענה מכל אחד מהסוגים האלה באופן מפורש בהגדרת המדיניות, או באופן עקיף באמצעות הפניה למשתנה של זרימת נתונים.
| ברירת מחדל | לא רלוונטי |
| נוכחות | אופציונלי |
| סוג |
מחרוזת (ברירת מחדל), מספר, ערך בוליאני או מפה. אם לא מציינים סוג, ברירת המחדל היא String. |
| מערך | מגדירים את הערך true כדי לציין אם הערך הוא מערך של סוגים. ברירת מחדל: false |
| ערכים אפשריים | כל ערך שרוצים להשתמש בו לטענה נוספת. |
רכיב <Claim> מקבל את המאפיינים הבאים:
- name – (חובה) שם התלונה.
- ref – (אופציונלי) השם של משתנה של זרימת נתונים. אם המשתנה הזה קיים, המדיניות תשתמש בערך שלו כמאפיין. אם מציינים גם מאפיין ref וגם ערך הצהרה מפורש, ערך ברירת המחדל הוא הערך המפורש, והמערכת משתמשת בו אם משתנה הזרימה שאליו מתבצעת ההפניה לא נפתר.
- type – (אופציונלי) אחד מהערכים הבאים: string (ברירת מחדל), number, boolean או map
- array – (אופציונלי) מגדירים את הערך true כדי לציין אם הערך הוא מערך של סוגים. ברירת מחדל: false.
<CustomClaims>
הערה: בשלב הזה, רכיב CustomClaims מוכנס כשמוסיפים מדיניות GenerateJWT חדשה דרך ממשק המשתמש. האלמנט הזה לא פונקציונלי והמערכת מתעלמת ממנו. במקום זאת, צריך להשתמש ברכיב הנכון <AdditionalClaims>. ממשק המשתמש יעודכן בהמשך כדי להוסיף את הרכיבים הנכונים.
<Id>
<Id>explicit-jti-value-here</Id> -or- <Id ref='variable-name-here'/> -or- <Id/>
הפונקציה בודקת אם ב-JWT יש את ההצהרה הספציפית jti. אם ערך הטקסט והמאפיין ref ריקים, המדיניות תיצור jti שמכיל UUID אקראי. המאפיין JWT ID (jti) הוא מזהה ייחודי של ה-JWT. מידע נוסף על jti זמין ב-RFC7519.
| ברירת מחדל | לא רלוונטי |
| נוכחות | אופציונלי |
| סוג | מחרוזת או הפניה. |
| ערכים אפשריים | מחרוזת או שם של משתנה של זרימת נתונים שמכיל את המזהה. |
<IgnoreCriticalHeaders>
<IgnoreCriticalHeaders>true|false</IgnoreCriticalHeaders>
מגדירים את הערך כ-false אם רוצים שהמדיניות תציג שגיאה כשכותרת כלשהי שמופיעה בכותרת crit של ה-JWT לא מופיעה ברכיב <KnownHeaders>.
אם המדיניות מוגדרת כ-True, המדיניות VerifyJWT מתעלמת מהכותרת crit.
אחת הסיבות להגדרת הרכיב הזה כ-True היא אם אתם נמצאים בסביבת בדיקה ועדיין לא מוכנים לטפל בכשל בכותרת חסרה.
| ברירת מחדל | FALSE |
| נוכחות | אופציונלי |
| סוג | בוליאני |
| ערכים אפשריים | נכון או לא נכון |
<IgnoreIssuedAt>
<IgnoreIssuedAt>true|false</IgnoreIssuedAt>
אם רוצים שהמדיניות תקפיץ הודעת שגיאה (throw) כש-JWT מכיל הצהרה iat (הונפק בתאריך) שמציינת זמן עתידי, צריך להגדיר את הערך false (ברירת מחדל).
אם המדיניות מוגדרת כ-True, המערכת מתעלמת מiat במהלך האימות.
| ברירת מחדל | FALSE |
| נוכחות | אופציונלי |
| סוג | בוליאני |
| ערכים אפשריים | נכון או לא נכון |
<IgnoreUnresolvedVariables>
<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>
מגדירים את הערך כ-FALSE אם רוצים שהמדיניות תקפיץ הודעת שגיאה (throw) כשמשתנה כלשהו שמוגדר בה לא ניתן לפתרון. הגדרה ל-true תגרום להתייחסות לכל משתנה שלא ניתן לפתור כמחרוזת ריקה (null).
| ברירת מחדל | FALSE |
| נוכחות | אופציונלי |
| סוג | בוליאני |
| ערכים אפשריים | נכון או לא נכון |
<Issuer>
<VerifyJWT name='VJWT-29'> ... <!-- verify that the iss claim matches a hard-coded value --> <Issuer>issuer-string-here</Issuer> or: <!-- verify that the iss claim matches the value contained in a variable --> <Issuer ref='variable-containing-issuer'/> or: <!-- verify via a variable; fallback to a hard-coded value if the variable is empty --> <Issuer ref='variable-containing-issuer'>fallback-value-here</Issuer>
המדיניות בודקת שהנפקן ב-JWT (ההצהרה iss) תואם למחרוזת
שצוינה ברכיב ההגדרה. הטענה iss היא אחת מהטענות הרשומות שמוזכרות ב-IETF RFC 7519.
| ברירת מחדל | לא רלוונטי |
| נוכחות | אופציונלי |
| סוג | מחרוזת או הפניה |
| ערכים אפשריים | הכול |
<KnownHeaders>
<KnownHeaders>a,b,c</KnownHeaders> or: <KnownHeaders ref='variable_containing_headers'/>
המדיניות GenerateJWT משתמשת ברכיב <CriticalHeaders> כדי לאכלס את הכותרת crit ב-JWT. לדוגמה:
{
"typ": "...",
"alg" : "...",
"crit" : [ "a", "b", "c" ],
}מדיניות VerifyJWT בודקת את הכותרת crit ב-JWT, אם היא קיימת, ועבור כל כותרת שמופיעה בה
היא בודקת אם גם הרכיב <KnownHeaders> מפרט את הכותרת הזו. הרכיב
<KnownHeaders> יכול להכיל קבוצת על של הפריטים שמפורטים ב-crit.
כל הכותרות שמופיעות ב-crit צריכות להופיע ברכיב <KnownHeaders>. אם המדיניות מוצאת בכותרת crit שדה שלא מופיע גם ב-<KnownHeaders>, המדיניות VerifyJWT תיכשל.
אפשר גם להגדיר את מדיניות VerifyJWT כך שתתעלם מהכותרת crit על ידי הגדרת הרכיב <IgnoreCriticalHeaders> לערך true.
| ברירת מחדל | לא רלוונטי |
| נוכחות | אופציונלי |
| סוג | מערך של מחרוזות שמופרדות בפסיקים |
| ערכים אפשריים | מערך או שם של משתנה שמכיל את המערך. |
<MaxLifespan>
<VerifyJWT name='VJWT-62'> ... <!-- hard-coded lifespan of 5 minutes --> <MaxLifespan>5m</MaxLifespan> or: <!-- refer to a variable --> <MaxLifespan ref='variable-here'/> or: <!-- attribute telling the policy to use iat rather than nbf --> <MaxLifespan useIssueTime='true'>1h</MaxLifespan> or: <!-- useIssueTime and ref, and hard-coded fallback value. --> <MaxLifespan useIssueTime='true' ref='variable-here'>1h</MaxLifespan> ...
המדיניות VerifyJWT מוגדרת לבדיקה של משך החיים של אסימון, כדי לוודא שהוא לא חורג מסף שצוין. אפשר לציין את ערך הסף באמצעות מספר שאחריו תו שמציין את מספר השניות, הדקות, השעות, הימים או השבועות. התווים הבאים הם תווים תקינים:
-
s- שניות m- דקותh- hours-
dעד ימים w- שבועות
לדוגמה, אפשר לציין אחד מהערכים הבאים: 120s, 10m, 1h, 7d, 3w.
המדיניות מחשבת את משך החיים בפועל של האסימון על ידי הפחתת הערך של התאריך והשעה שבהם האסימון מתחיל להיות תקף (nbf) מהערך של התאריך והשעה שבהם האסימון יפוג (exp). אם חסר אחד מהמאפיינים exp או nbf, המדיניות תחזיר שגיאה. אם משך החיים של האסימון חורג ממשך הזמן שצוין, המדיניות מחזירה שגיאה.
אפשר להגדיר את מאפיין האופציונלי useIssueTime לערך true כדי להשתמש בערך iat במקום בערך nbf כשמחשבים את משך החיים של הטוקן.
השימוש ברכיב MaxLifespan
הוא אופציונלי. אם משתמשים ברכיב הזה, אפשר להשתמש בו רק פעם אחת.
<PrivateKey>
משתמשים ברכיב הזה כדי לציין את המפתח הפרטי שאפשר להשתמש בו כדי לאמת JWT מוצפן באמצעות אלגוריתם אסימטרי. בהמשך מופיע תיאור של רכיבי צאצא אפשריים.
<Password>
<PrivateKey> <Password ref="private.privatekey-password"/> </PrivateKey>
צאצא של הרכיב <PrivateKey>. מציינת את הסיסמה שבה המדיניות צריכה להשתמש כדי לפענח את המפתח הפרטי, אם יש צורך בכך, כשמאמתים JWT מוצפן.
משתמשים במאפיין ref כדי להעביר את הסיסמה במשתנה של זרימת נתונים.
| ברירת מחדל | לא רלוונטי |
| נוכחות | אופציונלי |
| סוג | String |
| ערכים אפשריים |
הפניה למשתנה של זרימה.
הערה: צריך לציין משתנה של זרימת נתונים. Apigee ידחה הגדרת מדיניות שבה הסיסמה מצוינת בטקסט רגיל, כי היא לא תקינה. למשתנה של התהליך
חייבת להיות הקידומת 'private'. לדוגמה, |
<Value>
<PrivateKey> <Value ref="private.variable-name-here"/> </PrivateKey>
רכיב צאצא של הרכיב <PrivateKey>. מציין מפתח פרטי בקידוד PEM
שהמדיניות תשתמש בו כדי לאמת JWT מוצפן. משתמשים במאפיין ref כדי להעביר את המפתח במשתנה של זרימת נתונים.
| ברירת מחדל | לא רלוונטי |
| נוכחות | נדרש לאימות JWT שהוצפן באמצעות אלגוריתם הצפנה של מפתח אסימטרי. |
| סוג | String |
| ערכים אפשריים |
משתנה של זרימת נתונים שמכיל מחרוזת שמייצגת ערך של מפתח פרטי מסוג RSA שעבר קידוד PEM.
הערה: למשתנה של זרימת הנתונים צריך להיות הקידומת 'private'. לדוגמה,
|
<PublicKey>
מציינת את המקור של המפתח הציבורי שמשמש לאימות JWT שנחתם באמצעות אלגוריתם אסימטרי. האלגוריתמים הנתמכים כוללים את RS256/RS384/RS512, PS256/PS384/PS512 או ES256/ES384/ES512. בהמשך מופיע תיאור של רכיבי הצאצא האפשריים.
<Certificate>
<PublicKey> <Certificate ref="signed_public.cert"/> </PublicKey> -or- <PublicKey> <Certificate> -----BEGIN CERTIFICATE----- certificate data -----END CERTIFICATE----- </Certificate> </PublicKey>
רכיב צאצא של הרכיב <PublicKey>. מציין את האישור החתום שמשמש כמקור של המפתח הציבורי. משתמשים במאפיין ref
כדי להעביר את האישור החתום במשתנה של זרימת העבודה, או מציינים את האישור בקידוד PEM
ישירות. חשוב לוודא שנתוני האישור בצד ימין מיושרים כמו בדוגמה שמופיעה כאן.
| ברירת מחדל | לא רלוונטי |
| נוכחות | זה שינוי אופציונלי. כדי לאמת JWT שנחתם באמצעות אלגוריתם אסימטרי, צריך להשתמש ברכיב <Certificate>, <JWKS> או <Value> כדי לספק את המפתח הציבורי. |
| סוג | String |
| ערכים אפשריים | משתנה או מחרוזת של זרימת נתונים. |
<JWKS>
<PublicKey>
<JWKS … > … </JWKS>
</PublicKey>רכיב צאצא של הרכיב <PublicKey>. הגדרה של JWKS כמקור של מפתחות ציבוריים. זו תהיה רשימת מפתחות בפורמט שמתואר ב-IETF RFC 7517 – JSON Web Key (JWK).
אם ל-JWT הנכנס יש מזהה מפתח שקיים ב-JWKS, המדיניות תשתמש במפתח הציבורי הנכון כדי לאמת את חתימת ה-JWT. לפרטים על התכונה הזו, אפשר לעיין במאמר שימוש ב-JSON Web Key Set (JWKS) כדי לאמת JWT.
אם מאחזרים את הערך מכתובת URL ציבורית, מערכת Apigee שומרת את ה-JWKS במטמון למשך 300 שניות. כשפג התוקף של המטמון, Apigee מאחזר שוב את JWKS.
| ברירת מחדל | לא רלוונטי |
| נוכחות | זה שינוי אופציונלי. כדי לאמת JWT שנחתם באמצעות אלגוריתם אסימטרי, צריך להשתמש ברכיב <Certificate>, <JWKS> או <Value> כדי לספק את המפתח הציבורי. |
| סוג | String |
| ערכים אפשריים |
אפשר לציין את JWKS באחת מארבע דרכים:
|
<Value>
<PublicKey> <Value ref="public.publickeyorcert"/> </PublicKey> -or- <PublicKey> <Value> -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw2kPrRzcufvUNHvTH/WW ...YOUR PUBLIC KEY MATERIAL HERE....d1lH8MfUyRXmpmnNxJHAC2F73IyN ZmkDb/DRW5onclGzxQITBFP3S6JXd4LNESJcTp705ec1cQ9Wp2Kl+nKrKyv1E5Xx DQIDAQAB -----END PUBLIC KEY----- </Value> </PublicKey>
רכיב צאצא של הרכיב <PublicKey>. מציין את המפתח הציבורי שבו יש להשתמש כדי לאמת את החתימה ב-JWT חתום. משתמשים במאפיין ref כדי להעביר את המפתח במשתנה של זרימת נתונים, או מציינים את המפתח בקידוד PEM ישירות. חשוב להקפיד על יישור המפתח הציבורי בצד ימין, כמו שמוצג בדוגמה.
| ברירת מחדל | לא רלוונטי |
| נוכחות | זה שינוי אופציונלי. כדי לאמת JWT שנחתם באמצעות אלגוריתם אסימטרי, צריך להשתמש ברכיב <Certificate>, <JWKS> או <Value> כדי לספק את המפתח הציבורי. |
| סוג | String |
| ערכים אפשריים | משתנה או מחרוזת של זרימת נתונים. |
<RequiredClaims>
<VerifyJWT name='VJWT-1'> ... <!-- Directly specify the names of the claims to require --> <RequiredClaims>sub,iss,exp</RequiredClaims> -or- <!-- Specify the claim names indirectly, via a context variable --> <RequiredClaims ref='claims_to_require'/> ... </VerifyJWT>
הרכיב <RequiredClaims> הוא אופציונלי. הוא מציין רשימה של שמות של הצהרות שמופרדים באמצעות פסיקים, שחייבים להיות במטען הייעודי של JWT כשמאמתים JWT. האלמנט
מוודא ש-JWT המוצג מכיל את הטענות הנדרשות, אבל לא מאמת את התוכן
של הטענות. אם אחד מהתנאים שמופיעים ברשימה לא מתקיים, המדיניות VerifyJWT תציג שגיאה בזמן הריצה.
| ברירת מחדל | לא רלוונטי |
| נוכחות | אופציונלי |
| סוג | String |
| ערכים אפשריים | רשימה מופרדת בפסיקים של שמות טענות. |
<SecretKey>
<SecretKey encoding="base16|hex|base64|base64url" > <Value ref="private.your-variable-name"/> </SecretKey>
האלמנט SecretKey הוא אופציונלי. הוא מציין את המפתח הסודי שבו יש להשתמש כשמאמתים JWT חתום שמשתמש באלגוריתם סימטרי (HS*) או כשמאמתים JWT מוצפן שמשתמש באלגוריתם סימטרי (AES) להצפנת מפתח.
ילדים של <SecretKey>
בטבלה הבאה מפורטים מאפייני הצאצא של <SecretKey>:
| צאצא | נוכחות | תיאור |
|---|---|---|
| קידוד (מאפיין) | אופציונלי | מציין איך המפתח מקודד במשתנה שאליו מתבצעת ההפניה. כברירת מחדל, אם לא מופיע מאפיין <SecretKey encoding="hex" > <Value ref="private.secretkey"/> </SecretKey> בדוגמה שלמעלה, מכיוון שהקידוד הוא |
| ערך (רכיב) | חובה | מפתח סודי מוצפן. מציינת את המפתח הסודי שישמש לאימות המטען הייעודי (payload). אפשר להשתמש במאפיין <SecretKey> <Value ref="private.my-secret-variable"/> </SecretKey> מערכת Apigee אוכפת חוזק מינימלי של מפתח לאלגוריתמים HS256/HS384/HS512. אורך המפתח המינימלי ל-HS256 הוא 32 בייטים, ל-HS384 הוא 48 בייטים ול-HS512 הוא 64 בייטים. שימוש במפתח עם חוזק נמוך יותר גורם לשגיאת זמן ריצה. |
<Source>
<Source>jwt-variable</Source>
אם יש כזה, הוא מציין את משתנה הזרימה שבו המדיניות מצפה למצוא את ה-JWT לאימות.
באמצעות הרכיב הזה, אפשר להגדיר את המדיניות כך שתאחזר את ה-JWT מטופס או ממשתנה של פרמטר שאילתה, או מכל משתנה אחר. אם האלמנט הזה קיים, המדיניות לא תסיר את הקידומת Bearer, אם היא קיימת. אם המשתנה לא קיים או אם המדיניות לא מוצאת JWT במשתנה שצוין, המדיניות מחזירה שגיאה.
כברירת מחדל, כשאין רכיב <Source>, המדיניות מאחזרת את אסימון ה-JWT על ידי קריאת המשתנה request.header.authorization והסרת הקידומת Bearer. אם מעבירים את ה-JWT בכותרת Authorization בתור טוקן מסוג Bearer (עם הקידומת Bearer), לא מציינים את הרכיב <Source> בהגדרת המדיניות. לדוגמה, לא תשתמשו ברכיב <Source> בהגדרת המדיניות אם תעבירו את ה-JWT בכותרת Authorization כך:
curl -v https://api-endpoint/proxy1_basepath/api1 -H "Authorization: Bearer eyJhbGciOiJ..."
| ברירת מחדל | request.header.authorization (מידע חשוב על ברירת המחדל מופיע בהערה שלמעלה). |
| נוכחות | אופציונלי |
| סוג | String |
| ערכים אפשריים | שם של משתנה בתהליך עבודה ב-Apigee. |
<Subject>
<VerifyJWT name='VJWT-8'> ... <!-- verify that the sub claim matches a hard-coded value --> <Subject>subject-string-here</Subject> or: <!-- verify that the sub claim matches the value contained in a variable --> <Subject ref='variable-containing-subject'/> or: <!-- verify via a variable; fallback to a hard-coded value if the variable is empty --> <Subject ref='variable-containing-subject'>fallback-value-here</Subject>
המדיניות בודקת אם הנושא ב-JWT (הצהרת sub) תואם למחרוזת
שצוינה בהגדרת המדיניות. הטענה sub היא אחת מהטענות הרשומות שמתוארות ב-RFC7519.
| ברירת מחדל | לא רלוונטי |
| נוכחות | אופציונלי |
| סוג | String |
| ערכים אפשריים | כל ערך שמזהה באופן ייחודי נושא. |
<TimeAllowance>
<VerifyJWT name='VJWT-23'> ... <!-- configure a hard-coded time allowance of 20 seconds --> <TimeAllowance>20s</TimeAllowance> or: <!-- refer to a variable containing the time allowance --> <TimeAllowance ref='variable-containing-time-allowance'/> or: <!-- refer to a variable; fallback to a hard-coded value if the variable is empty --> <TimeAllowance ref='variable-containing-allowance'>30s</TimeAllowance>
'תקופת החסד' לזמנים, כדי להתחשב בהטיה בשעון בין הגורם המנפיק לבין הגורם המאמת של JWT. השינוי הזה יחול גם על התוקף (טענת exp) וגם על הזמן שלפני (טענת nbf). לדוגמה, אם מרווח הזמן מוגדר כ-30s, אז JWT שתוקפו פג ייחשב כתקף למשך 30 שניות אחרי מועד התפוגה שצוין. התאריך והשעה שלפני כן ייבדקו באופן דומה.
| ברירת מחדל | 0 שניות (אין תקופת חסד) |
| נוכחות | אופציונלי |
| סוג | String |
| ערכים אפשריים |
ביטוי של טווח זמן או הפניה למשתנה של זרימת עבודה שמכיל ביטוי.
אפשר לציין טווחי זמן באמצעות מספר שלם חיובי שאחריו תו אחד שמציין יחידת זמן, באופן הבא:
|
<Type>
<Type>type-string-here</Type>
ההגדרה הזו מתארת אם המדיניות מאמתת JWT חתום או JWT מוצפן.
הרכיב <Type> הוא אופציונלי. אפשר להשתמש בה כדי ליידע את הקוראים לגבי ההגדרה, אם המדיניות יוצרת JWT חתום או מוצפן.
- אם רכיב
<Type>קיים:- אם הערך של
<Type>הואSigned, המדיניות מאמתת JWT חתום, ורכיב<Algorithm>חייב להיות קיים. - אם הערך של
<Type>הואEncrypted, המדיניות מאמתת JWT מוצפן, והרכיב<Algorithms>חייב להיות קיים.
- אם הערך של
- אם רכיב
<Type>לא מופיע:- אם הרכיב
<Algorithm>קיים, המדיניות מניחה שהערך של<Type>הואSigned. - אם הרכיב
<Algorithms>קיים, המדיניות מניחה ש-<Type>הואEncrypted.
- אם הרכיב
- אם אף אחד מהפרמטרים
<Algorithm>ו-<Algorithms>לא מופיע, ההגדרה לא תקינה.
| ברירת מחדל | לא רלוונטי |
| נוכחות | אופציונלי |
| סוג | String |
| ערכים אפשריים | Signed או Encrypted |
משתני Flow
אם הפעולה מצליחה, כללי המדיניות Verify JWT ו-Decode JWT מגדירים משתני הקשר לפי התבנית הבאה:
jwt.{policy_name}.{variable_name}
לדוגמה, אם שם המדיניות הוא jwt-parse-token , המדיניות תאחסן את הנושא שצוין ב-JWT במשתנה ההקשר שנקרא jwt.jwt-parse-token.decoded.claim.sub.
(לתאימות לאחור, הוא יהיה זמין גם ב-jwt.jwt-parse-token.claim.subject)
| שם המשתנה | תיאור |
|---|---|
claim.audience |
השדה 'קהל היעד' ב-JWT. הערך יכול להיות מחרוזת או מערך של מחרוזות. |
claim.expiry |
תאריך ושעת התפוגה, באלפיות השנייה מאז תחילת התקופה של זמן מערכת. |
claim.issuedat |
התאריך שבו הונפק האסימון, במילישניות מאז תקופת ה-Epoch. |
claim.issuer |
הצהרת המנפיק של ה-JWT. |
claim.notbefore |
אם ה-JWT כולל טענת nbf, המשתנה הזה יכיל את הערך, שמבוטא באלפיות השנייה מאז תקופת האפוק. |
claim.subject |
הצהרת הנושא של JWT. |
claim.name |
הערך של הטענה עם השם (רגילה או נוספת) במטען הייעודי (payload). אחת מהטענות האלה תוגדר לכל טענה במטען הייעודי (payload). |
decoded.claim.name |
הערך שניתן לניתוח ב-JSON של הטענה עם השם (סטנדרטית או נוספת) במטען הייעודי (payload). משתנה אחד מוגדר לכל טענה במטען הייעודי (payload). לדוגמה, אפשר להשתמש ב-decoded.claim.iat כדי לאחזר את שעת ההנפקה של ה-JWT, שמצוינת בשניות מאז תקופת ה-epoch. אפשר גם להשתמש במשתני הזרימה claim.name, אבל מומלץ להשתמש במשתנה הזה כדי לגשת לתלונה. |
decoded.header.name |
הערך של כותרת במטען הייעודי (payload) שאפשר לנתח ב-JSON. משתנה אחד מוגדר לכל כותרת במטען הייעודי (payload). אפשר גם להשתמש במשתני הזרימה header.name, אבל מומלץ להשתמש במשתנה הזה כדי לגשת לכותרת. |
expiry_formatted |
תאריך ושעת התפוגה, בפורמט של מחרוזת שאנשים יכולים לקרוא. דוגמה: 2017-09-28T21:30:45.000+0000 |
header.algorithm |
אלגוריתם החתימה שבו נעשה שימוש ב-JWT. לדוגמה, RS256, HS384 וכן הלאה. מידע נוסף זמין במאמר פרמטר הכותרת(אלגוריתם). |
header.kid |
מזהה המפתח, אם הוא נוסף כשנוצר אסימון ה-JWT. כדי לאמת אסימון JWT, אפשר לעיין גם בקטע 'שימוש ב-JSON Web Key Set (JWKS)' במאמר סקירה כללית של מדיניות JWT. מידע נוסף זמין במאמר בנושא פרמטר הכותרת(מזהה המפתח). |
header.type |
הערך יהיה JWT. |
header.name |
הערך של הכותרת שצוינה (רגילה או נוספת). אחד מהם יוגדר לכל כותרת נוספת בחלק הכותרת של ה-JWT. |
header-json |
הכותרת בפורמט JSON. |
is_expired |
נכון או לא נכון |
payload-claim-names |
מערך של טענות שנתמכות על ידי ה-JWT. |
payload-json |
המטען הייעודי (payload) בפורמט JSON.
|
seconds_remaining |
מספר השניות עד שתוקף הטוקן יפוג. אם תוקף האסימון פג, המספר הזה יהיה שלילי. |
time_remaining_formatted |
הזמן שנותר עד שתוקף הטוקן יפוג, בפורמט של מחרוזת שאנשים יכולים לקרוא. דוגמה: 00:59:59.926 |
valid |
במקרה של VerifyJWT, המשתנה הזה יהיה true אם החתימה אומתה, ואם השעה הנוכחית היא לפני תפוגת הטוקן ואחרי הערך של הטוקן notBefore, אם הם קיימים. אחרת, הפלט הוא False.
במקרה של DecodeJWT, המשתנה הזה לא מוגדר. |
הפניה לשגיאה
בקטע הזה מתוארים קודי השגיאות והודעות השגיאה שמוחזרים, ומשתני השגיאה שמוגדרים על ידי Apigee כשהמדיניות הזו מפעילה שגיאה. חשוב לדעת את המידע הזה אם אתם מפתחים כללי תקלות לטיפול בתקלות. מידע נוסף על שגיאות שקשורות למדיניות ועל טיפול בשגיאות
שגיאות זמן ריצה
השגיאות האלה יכולות להתרחש כשהמדיניות מופעלת.
| קוד תקלה | סטטוס HTTP | מתרחש כאשר |
|---|---|---|
steps.jwt.AlgorithmInTokenNotPresentInConfiguration |
401 |
השגיאה מתרחשת כשבמדיניות האימות יש כמה אלגוריתמים. |
steps.jwt.AlgorithmMismatch |
401 |
האלגוריתם שצוין במדיניות Generate לא תאם לזה שצוין במדיניות Verify. האלגוריתמים שצוינו צריכים להיות זהים. |
steps.jwt.FailedToDecode |
401 |
המדיניות לא הצליחה לפענח את ה-JWT. יכול להיות ש-JWT פגום. |
steps.jwt.GenerationFailed |
401 |
המדיניות לא הצליחה ליצור את ה-JWT. |
steps.jwt.InsufficientKeyLength |
401 |
למפתח קטן מ-32 בייטים לאלגוריתם HS256, קטן מ-48 בייטים לאלגוריתם HS386 וקטן מ-64 בייטים לאלגוריתם HS512. |
steps.jwt.InvalidClaim |
401 |
אם חסרה טענה או שיש אי התאמה בין טענות, או אם חסרה כותרת או שיש אי התאמה בין כותרות. |
steps.jwt.InvalidConfiguration |
401 |
האלמנטים <Algorithm> ו-<Algorithms> קיימים. |
steps.jwt.InvalidCurve |
401 |
העקומה שצוינה על ידי המפתח לא תקפה לאלגוריתם של עקומה אליפטית. |
steps.jwt.InvalidIterationCount |
401 |
מספר האיטרציות ששימש ב-JWT המוצפן לא שווה למספר האיטרציות שצוין בהגדרת המדיניות VerifyJWT. ההגדרה הזו חלה רק על JWT שנעשה בהם שימוש ב-<PasswordKey>. |
steps.jwt.InvalidJsonFormat |
401 |
נמצא JSON לא תקין בכותרת או במטען הייעודי (payload). |
steps.jwt.InvalidKeyConfiguration |
401 |
הערך JWKS ברכיב <PublicKey> לא תקין. יכול להיות שהסיבה לכך היא שלא ניתן להגיע לנקודת הקצה של ה-URI של ה-JWKS ממופע Apigee. בודקים את הקישוריות לנקודת הקצה על ידי יצירת פרוקסי passthrough ושימוש בנקודת הקצה של JWKS כיעד. |
steps.jwt.InvalidSaltLength |
401 |
אורך המלח ששימש ב-JWT המוצפן לא שווה לאורך המלח
שצוין בהגדרת המדיניות VerifyJWT. ההגדרה הזו חלה רק על JWT שנעשה בהם שימוש ב-<PasswordKey>. |
steps.jwt.InvalidPasswordKey |
401 |
המפתח שצוין לא עמד בדרישות. |
steps.jwt.InvalidPrivateKey |
401 |
המפתח שצוין לא עמד בדרישות. |
steps.jwt.InvalidPublicKey |
401 |
המפתח שצוין לא עמד בדרישות. |
steps.jwt.InvalidSecretKey |
401 |
המפתח שצוין לא עמד בדרישות. |
steps.jwt.InvalidToken |
401 |
השגיאה הזו מתרחשת כשאימות החתימה של ה-JWT נכשל. |
steps.jwt.JwtAudienceMismatch |
401 |
הטענה לגבי הקהל נכשלה באימות הטוקן. |
steps.jwt.JwtIssuerMismatch |
401 |
האימות של הטוקן נכשל בגלל טענת המנפיק. |
steps.jwt.JwtSubjectMismatch |
401 |
הטענה בנושא נכשלה באימות הטוקן. |
steps.jwt.KeyIdMissing |
401 |
המדיניות Verify משתמשת ב-JWKS כמקור למפתחות ציבוריים, אבל ה-JWT החתום לא כולל את המאפיין kid בכותרת. |
steps.jwt.KeyParsingFailed |
401 |
לא הייתה אפשרות לנתח את המפתח הציבורי מפרטי המפתח שצוינו. |
steps.jwt.NoAlgorithmFoundInHeader |
401 |
השגיאה מתרחשת כש-JWT לא מכיל כותרת אלגוריתם. |
steps.jwt.NoMatchingPublicKey |
401 |
מדיניות Verify משתמשת ב-JWKS כמקור למפתחות ציבוריים, אבל kid ב-JWT החתום לא מופיע ב-JWKS. |
steps.jwt.SigningFailed |
401 |
ב-GenerateJWT, אם המפתח קטן מהגודל המינימלי לאלגוריתמים HS384 או HS512 |
steps.jwt.TokenExpired |
401 |
המדיניות מנסה לאמת טוקן שפג תוקפו. |
steps.jwt.TokenNotYetValid |
401 |
הטוקן עדיין לא תקף. |
steps.jwt.UnhandledCriticalHeader |
401 |
כותרת שנמצאה על ידי מדיניות האימות של JWT בכותרת crit לא מופיעה ב-KnownHeaders. |
steps.jwt.UnknownException |
401 |
אירעה חריגה לא ידועה. |
steps.jwt.WrongKeyType |
401 |
צוין סוג שגוי של מפתח. לדוגמה, אם מציינים מפתח RSA לאלגוריתם של עקומות אליפטיות, או מפתח עקומה לאלגוריתם RSA. |
שגיאות פריסה
השגיאות האלה יכולות להתרחש כשפורסים שרת proxy שמכיל את המדיניות הזו.
| שם השגיאה | מטרה | תיקון |
|---|---|---|
InvalidNameForAdditionalClaim |
הפריסה תיכשל אם התביעה שמשמשת ברכיב הצאצא <Claim> של הרכיב <AdditionalClaims> היא אחת מהשמות הרשומים הבאים: kid, iss, sub, aud, iat, exp, nbf או jti.
|
build |
InvalidTypeForAdditionalClaim |
אם התביעה שנעשה בה שימוש ברכיב הבן <Claim>
של הרכיב <AdditionalClaims> היא לא מסוג string, number,
boolean או map, הפריסה תיכשל.
|
build |
MissingNameForAdditionalClaim |
אם השם של התביעה לא מצוין ברכיב הצאצא <Claim>
של הרכיב <AdditionalClaims>, הפריסה תיכשל.
|
build |
InvalidNameForAdditionalHeader |
השגיאה הזו מתרחשת כששם הטענה שמשמש ברכיב הצאצא <Claim>
של הרכיב <AdditionalClaims> הוא alg או typ.
|
build |
InvalidTypeForAdditionalHeader |
אם סוג הטענה שמשמש ברכיב הבן <Claim> של הרכיב <AdditionalClaims> הוא לא מהסוגים string, number, boolean או map, הפריסה תיכשל.
|
build |
InvalidValueOfArrayAttribute |
השגיאה הזו מתרחשת כשערך מאפיין המערך ברכיב הצאצא <Claim>
של הרכיב <AdditionalClaims> לא מוגדר כ-true או כ-false.
|
build |
InvalidValueForElement |
אם הערך שצוין ברכיב <Algorithm> הוא לא ערך נתמך, הפריסה תיכשל.
|
build |
MissingConfigurationElement |
השגיאה הזו תתרחש אם לא משתמשים באלמנט <PrivateKey> עם אלגוריתמים של משפחת RSA, או אם לא משתמשים באלמנט <SecretKey> עם אלגוריתמים של משפחת HS.
|
build |
InvalidKeyConfiguration |
אם רכיב הבן <Value> לא מוגדר ברכיבים <PrivateKey>
או <SecretKey>, הפריסה תיכשל.
|
build |
EmptyElementForKeyConfiguration |
אם מאפיין ההפניה ref של רכיב הבן <Value> של הרכיבים <PrivateKey> או <SecretKey> ריק או לא צוין, הפריסה תיכשל.
|
build |
InvalidConfigurationForVerify |
השגיאה הזו מתרחשת אם האלמנט <Id> מוגדר בתוך האלמנט <SecretKey>.
|
build |
InvalidEmptyElement |
השגיאה הזו מתרחשת אם הרכיב <Source> של מדיניות Verify JWT ריק. אם הוא קיים, צריך להגדיר אותו עם שם משתנה של Apigee flow.
|
build |
InvalidPublicKeyValue |
אם הערך שמשמש ברכיב הצאצא <JWKS> של הרכיב <PublicKey> לא תואם לפורמט התקין שמוגדר ב-RFC 7517, הפריסה תיכשל.
|
build |
InvalidConfigurationForActionAndAlgorithm |
אם משתמשים באלמנט <PrivateKey> עם אלגוריתמים של HS Family או באלמנט <SecretKey> עם אלגוריתמים של RSA Family, הפריסה תיכשל.
|
build |
משתני תקלות
המשתנים האלה מוגדרים כשמתרחשת שגיאת זמן ריצה. מידע נוסף על שגיאות שקשורות למדיניות
| משתנים | כאשר: | דוגמה |
|---|---|---|
fault.name="fault_name" |
fault_name הוא שם התקלה, כפי שמופיע בטבלה Runtime errors שלמעלה. שם התקלה הוא החלק האחרון של קוד התקלה. | fault.name Matches "InvalidToken" |
JWT.failed |
כל כללי המדיניות של JWT מגדירים את אותו משתנה במקרה של כשל. | JWT.failed = true |
דוגמה לתגובת שגיאה
לצורך טיפול בשגיאות, מומלץ ללכוד את החלק errorcode בתגובת השגיאה. אל תסתמכו על הטקסט ב-faultstring, כי הוא עשוי להשתנות.
דוגמה לכלל שגיאה
<FaultRules>
<FaultRule name="JWT Policy Errors">
<Step>
<Name>JavaScript-1</Name>
<Condition>(fault.name Matches "InvalidToken")</Condition>
</Step>
<Condition>JWT.failed=true</Condition>
</FaultRule>
</FaultRules>