מוצג המסמך של Apigee Edge.
עוברים אל
מסמכי תיעוד של Apigee X. מידע
מה
מאמתת את החתימה ב-JWT שהתקבל מלקוחות או ממערכות אחרות. המדיניות הזו גם מחלצת את ההצהרות למשתני הקשר כדי שכללי המדיניות או התנאים הבאים יוכלו את הערכים האלה כדי לקבל החלטות לגבי הרשאה או ניתוב. מבוא מפורט זמין במאמר סקירה כללית של המדיניות של JWS ו-JWT.
כשהמדיניות הזו מופעלת, Edge מאמת את החתימה של JWT ומאמת שה-JWT תקפים בהתאם למועד התפוגה ולמועדים לא לפני כן, אם הם קיימים. אפשר לבחור במדיניות לאמת גם את הערכים של תביעות ספציפיות ב-JWT, כמו הנושא, המנפיק, הקהל, או הערך של הצהרות נוספות.
אם ה-JWT מאומת ותקף, כל ההצהרות שכלולות ב-JWT מחולצים למשתני הקשר כדי להשתמש בהם בכללי המדיניות או בתנאים הבאים, והבקשה מורשה להמשיך. אם לא ניתן לאמת את חתימת ה-JWT או שה-JWT לא תקין בגלל אחת מחותמות הזמן, כל העיבוד נפסק ותוחזר שגיאה בתגובה.
מידע על החלקים של JWT ועל אופן ההצפנה והחתימה שלהם זמין בכתובת RFC7519.
וידאו
בסרטון קצר זה מוסבר איך לאמת את החתימה ב-JWT.
טעימות
אימות של אסימון JWT שנחתם עם ה-HS256 אלגוריתם
המדיניות לדוגמה הזו מאמתת JWT שנחתם באמצעות אלגוריתם ההצפנה HS256, HMAC
באמצעות סיכום ביקורת (checksum) מסוג SHA-256. ה-JWT מועבר בבקשת שרת ה-proxy באמצעות פרמטר טופס בשם
jwt המפתח נמצא במשתנה בשם private.secretkey.
בסרטון שלמעלה יש דוגמה מלאה, כולל הוראות לשליחת בקשה בהתאם למדיניות.
הגדרת המדיניות כוללת את המידע שנדרש ל-Edge כדי לפענח ולהעריך את ה-JWT. כמו המיקום של ה-JWT (במשתנה זרימה שצוין ברכיב Source). של אלגוריתם החתימה, היכן למצוא את המפתח הסודי (שמאוחסן במשתנה זרימה של Edge, שיכול אוחזרו מ-Edge 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 יכול לבדוק את הערכים האלה. בקטע משתני זרימה אפשר למצוא של המשתנים שהוגדרו במדיניות הזו.
אימות של JWT שנחתם עם ה-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"
}והמטען הייעודי (payload) הזה...
{
"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 לא תואמת לערך הנדרש של ה'נושא' רכיב בתור שצוינו בהגדרות המדיניות.
הפלט של המדיניות נכתב במשתני ההקשר, כך שכללי המדיניות או התנאים הבאים נכתבים בשרת ה-proxy ל-API יכול לבדוק את הערכים האלה. בקטע משתני זרימה אפשר למצוא של המשתנים שהוגדרו במדיניות הזו.
הגדרת הרכיבים העיקריים
הרכיבים שבהם משתמשים כדי לציין את המפתח שמשמש לאימות ה-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.
הערה: ההגדרות האישיות משתנות מעט בהתאם להצפנה באלגוריתם שבו אתם משתמשים. בקטע דוגמאות תוכלו לראות דוגמאות שממחישות ולהתאים אותם אישית לתרחישים לדוגמה ספציפיים.
מאפיינים שחלים על הרכיב ברמה העליונה
<VerifyJWT name="JWT" continueOnError="false" enabled="true" async="false">
המאפיינים הבאים משותפים לכל רכיבי ההורה של המדיניות.
| מאפיין | תיאור | ברירת מחדל | נוכחות |
|---|---|---|---|
| שם |
השם הפנימי של המדיניות. תווים שבהם אפשר להשתמש בשם מוגבלים ל:
A-Z0-9._\-$ % עם זאת, בממשק המשתמש לניהול Edge אוכפים פקודות נוספות
הגבלות, כגון הסרה אוטומטית של תווים שאינם אלפאנומריים.
אפשר להשתמש ברכיב |
לא רלוונטי | חובה |
| continueOnError |
צריך להגדיר את הערך false כדי להחזיר שגיאה כשמדיניות נכשלת. המצב הזה צפוי
של רוב כללי המדיניות.
יש להגדיר ל- |
false | אופציונלי |
| פעיל |
צריך להגדיר את הערך true כדי לאכוף את המדיניות.
הגדרת הערך |
true | אופציונלי |
| אסינכרוני | המאפיין הזה הוצא משימוש. | false | הוצא משימוש |
<DisplayName>
<DisplayName>Policy Display Name</DisplayName>
שימוש בנוסף למאפיין השם כדי להוסיף תווית למדיניות בעורך ה-Proxy של ממשק המשתמש לניהול בשם אחר בשפה טבעית.
| ברירת מחדל | אם משמיטים את הרכיב הזה, המערכת תשתמש בערך של מאפיין השם של המדיניות. |
| נוכחות | אופציונלי |
| סוג | מחרוזת |
<Algorithm>
<Algorithm>HS256</Algorithm>
מציינת את אלגוריתם ההצפנה לצורך חתימה על האסימון. אלגוריתמי RS*/PS*/ES* משתמשים בזוג מפתחות ציבורי/סודי, ואילו אלגוריתמים של HS* משתמשים בסוד משותף. ראו גם מידע על אלגוריתמים להצפנת חתימות
אפשר לציין כמה ערכים ולהפריד ביניהם באמצעות פסיקים. לדוגמה "HS256, HS512" או RS256, PS256. עם זאת, לא ניתן לשלב אלגוריתמים של HS* עם אחרים או עם אלגוריתמים של ES* עם אחרים, כי הם לדרוש סוג מפתח ספציפי. אפשר לשלב אלגוריתמי RS* ו-PS*.
| ברירת מחדל | לא רלוונטי |
| נוכחות | חובה |
| סוג | מחרוזת של ערכים שמופרדים בפסיקים |
| ערכים חוקיים | HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512, PS256, PS384, PS512 |
<Audience>
<Audience>audience-here</Audience> or: <Audience ref='variable-name-here'/>
המדיניות מאמתת שהצהרת הקהל ב-JWT תואמת לערך שצוין ב הגדרה אישית. אם לא נמצאה התאמה, המדיניות גורמת לשגיאה. הצהרה זו מזהה את שאליהם מיועד ה-JWT. זו אחת מהתלונות הרשומות שהוזכרו ב RFC7519.
| ברירת מחדל | לא רלוונטי |
| נוכחות | אופציונלי |
| סוג | מחרוזת |
| ערכים חוקיים | משתנה זרימה או מחרוזת שמזהים את הקהל. |
<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 כדי לציין אם הערך הוא מערך של סוגים. ברירת מחדל: לא נכון |
| ערכים חוקיים | כל ערך שרוצים להשתמש בו להצהרה נוספת. |
הרכיב <Claim> לוקח את המאפיינים הבאים:
- name – (חובה) שם התלונה.
- ref - (אופציונלי) השם של משתנה זרימה. אם השדה הזה קיים, המדיניות תשתמש בערך בתור ההצהרה. אם ציינתם גם מאפיין ref וגם ערך הצהרה מפורש, הערך של הפרמטר ערך מפורש הוא ברירת המחדל, ויש להשתמש בו אם משתנה הזרימה המופנה לא מפוענח.
- type – (אופציונלי) אחת מהאפשרויות: מחרוזת (ברירת מחדל), מספר, ערך בוליאני או מפה
- מערך – (אופציונלי) מגדירים את הערך true כדי לציין אם הערך הוא מערך של סוגים. ברירת מחדל: לא נכון.
כשכוללים את הרכיב <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. הערך של הצהרה נוספת יכול להיות מחרוזת, מספר, ערך בוליאני, מפה או מערך. מפה היא קבוצה של צמדי שם/ערך. ניתן לציין את הערך של הצהרה על זכויות יוצרים מכל אחד מהסוגים האלה באופן מפורש בהגדרת המדיניות, או בעקיפין דרך הפניה למשתנה זרימה.
| ברירת מחדל | לא רלוונטי |
| נוכחות | אופציונלי |
| סוג |
מחרוזת (ברירת מחדל), מספר, ערך בוליאני או מפה. ברירת המחדל של הסוג היא 'מחרוזת' אם לא מצוין סוג. |
| מערך | צריך להגדיר את הערך true כדי לציין אם הערך הוא מערך של סוגים. ברירת מחדל: לא נכון |
| ערכים חוקיים | כל ערך שרוצים להשתמש בו להצהרה נוספת. |
הרכיב <Claim> לוקח את המאפיינים הבאים:
- name – (חובה) שם התלונה.
- ref - (אופציונלי) השם של משתנה זרימה. אם השדה הזה קיים, המדיניות תשתמש בערך בתור ההצהרה. אם ציינתם גם מאפיין ref וגם ערך הצהרה מפורש, הערך של הפרמטר ערך מפורש הוא ברירת המחדל, ויש להשתמש בו אם משתנה הזרימה המופנה לא מפוענח.
- type – (אופציונלי) אחת מהאפשרויות: מחרוזת (ברירת מחדל), מספר, ערך בוליאני או מפה
- מערך – (אופציונלי) מגדירים את הערך true כדי לציין אם הערך הוא מערך של סוגים. ברירת מחדל: לא נכון.
<CustomClaims>
הערה: בשלב הזה, הרכיב CustomClaims מתווסף כשמוסיפים רכיב חדש יצירת מדיניות JWT דרך ממשק המשתמש. הרכיב הזה לא פעיל והמערכת מתעלמת ממנו. השם הנכון במקום זאת, הוא <AdditionalClaims>. ממשק המשתמש יעודכן כדי להוסיף את הרכיבים הנכונים מאוחר יותר.
<Id>
<Id>explicit-jti-value-here</Id> -or- <Id ref='variable-name-here'/> -or- <Id/>
מאמתת של-JWT יש את הצהרת ה-jti הספציפית. כשערך הטקסט וההפניה ריקים, המדיניות תיצור jti שמכיל מזהה ייחודי אקראי. מזהה ה-JWT (jti) הוא מזהה ייחודי של ה-JWT. מידע נוסף על jti זמין בכתובת RFC7519.
| ברירת מחדל | לא רלוונטי |
| נוכחות | אופציונלי |
| סוג | מחרוזת או הפניה. |
| ערכים חוקיים | מחרוזת או שם של משתנה זרימה המכיל את המזהה. |
<IgnoreCriticalHeaders>
<IgnoreCriticalHeaders>true|false</IgnoreCriticalHeaders>
יש להגדיר את הערך False אם רוצים שהמדיניות תגרור שגיאה כשכותרת כלשהי שמופיעה ברשימה
הכותרת crit של ה-JWT לא מופיעה ברכיב <KnownHeaders>.
יש להגדיר את הערך כ-True כדי לגרום למדיניות VerifyJWT להתעלם מהכותרת crit.
אחת מהסיבות להגדיר את הרכיב הזה כ-True היא אם אתם נמצאים בסביבת בדיקה ועדיין לא מוכן לגרום לכשל בכותרת חסרה.
| ברירת מחדל | false |
| נוכחות | אופציונלי |
| סוג | בוליאני |
| ערכים חוקיים | נכון או לא נכון |
<IgnoreIssuedAt>
<IgnoreIssuedAt>true|false</IgnoreIssuedAt>
יש להגדיר את הערך כ-False (ברירת מחדל) אם רוצים שהמדיניות תגרור שגיאה כש-JWT מכיל
הצהרה על זכויות יוצרים מסוג iat (הונפקה בתאריך) שמציינת שעה בעתיד.
יש להגדיר את הערך כ-True כדי שהמדיניות תתעלם מ-iat במהלך האימות.
| ברירת מחדל | false |
| נוכחות | אופציונלי |
| סוג | בוליאני |
| ערכים חוקיים | נכון או לא נכון |
<IgnoreUnresolvedVariables>
<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>
יש להגדיר את הערך כ-False אם רוצים שהמדיניות תגרור שגיאה כשמצוין משתנה כלשהו שאליו יש הפניה במדיניות לא ניתן לפתור. יש להגדיר את הערך כ-True כדי להתייחס לכל משתנה שלא ניתן לפתרון כמחרוזת ריקה (null).
| ברירת מחדל | false |
| נוכחות | אופציונלי |
| סוג | בוליאני |
| ערכים חוקיים | נכון או לא נכון |
<Issuer>
<Issuer ref='variable-name-here'/> <Issuer>issuer-string-here</Issuer>
המדיניות מאמתת שהמנפיק ב-JWT תואם למחרוזת שצוינה רכיב הגדרה. הצהרה שמזהה את המנפיק של ה-JWT. זהו אחד מ- קבוצת ההצהרות הרשומה שהוזכרה ב-RFC7519.
| ברירת מחדל | לא רלוונטי |
| נוכחות | אופציונלי |
| סוג | מחרוזת או הפניה |
| ערכים חוקיים | הכול |
<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.
| ברירת מחדל | לא רלוונטי |
| נוכחות | אופציונלי |
| סוג | מערך מחרוזות מופרדות בפסיקים |
| ערכים חוקיים | מערך או שם של משתנה שמכיל את המערך. |
<PublicKey/Certificate>
<PublicKey> <Certificate ref="signed_public.cert"/> </PublicKey> -or- <PublicKey> <Certificate> -----BEGIN CERTIFICATE----- cert data -----END CERTIFICATE----- </Certificate> </PublicKey>
מציינת את האישור החתום שמשמש לאימות החתימה ב-JWT. שימוש במאפיין ref כדי מעבירים את האישור החתום במשתנה זרימה, או מציינים את האישור בקידוד PEM באופן ישיר. יש להשתמש רק כאשר האלגוריתם הוא אחד מהפרמטרים הבאים: RS256/RS384/RS512 , PS256/PS384/PS512 או ES256/ES384/ES512.
| ברירת מחדל | לא רלוונטי |
| נוכחות | כדי לאמת JWT חתום באמצעות אלגוריתם RSA, עליך להשתמש באישור, JWKS או רכיבי ערך. |
| סוג | מחרוזת |
| ערכים חוקיים | משתנה זרימה או מחרוזת. |
<PublicKey/JWKS>
<!-- Specify the JWKS. --> <PublicKey> <JWKS>jwks-value-here</JWKS> </PublicKey> or: <!-- Specify a variable containing the JWKS. --> <PublicKey> <JWKS ref="public.jwks"/> </PublicKey> or: <!-- Specify a public URL that returns the JWKS. The URL is static, meaning you cannot set it using a variable. --> <PublicKey> <JWKS uri="jwks-url"/> </PublicKey>
מציין ערך בפורמט JWKS (RFC 7517) שמכילה קבוצה של מפתחות ציבוריים. יש להשתמש רק כאשר האלגוריתם הוא אחד מהערכים RS256/RS384/RS512, PS256/PS384/PS512, או ב-ES256/ES384/ES512.
אם ה-JWT הנכנס נושא מזהה מפתח שמופיע בקבוצה של JWKS, אז המדיניות תשתמש במפתח הציבורי הנכון כדי לאמת את חתימת ה-JWT. לפרטים על התכונה הזו, ראו שימוש ב-JSON Web Key Set (JWKS) כדי לאמת JWT.
אם מאחזרים את הערך מכתובת URL ציבורית, Edge לשמור את ה-JWKS במטמון למשך 300 שניות. כשפג תוקף המטמון, Edge מאחזר את ה-JWKS שוב.
| ברירת מחדל | לא רלוונטי |
| נוכחות | כדי לאמת JWT באמצעות אלגוריתם RSA, צריך להשתמש באישור, JWKS או רכיב ערך. |
| סוג | מחרוזת |
| ערכים חוקיים | משתנה זרימה, ערך מחרוזת או כתובת URL. |
<PublicKey/Value>
<PublicKey> <Value ref="public.publickeyorcert"/> </PublicKey> -or- <PublicKey> <Value> -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw2kPrRzcufvUNHvTH/WW Q0UrCw5c0+Y707KX3PpXkZGbtTT4nvU1jC0d1lHV8MfUyRXmpmnNxJHAC2F73IyN C5TBtXMORc+us7A2cTtC4gZV256bT4h3sIEMsDl0Joz9K9MPzVPFxa1i0RgNt06n Xn/Bs2UbbLlKP5Q1HPxewUDEh0gVMqz9wdIGwH1pPxKvd3NltYGfPsUQovlof3l2 ALvO7i5Yrm96kknfFEWf1EjmCCKvz2vjVbBb6mp1ZpYfc9MOTZVpQcXSbzb/BWUo ZmkDb/DRW5onclGzxQITBFP3S6JXd4LNESJcTp705ec1cQ9Wp2Kl+nKrKyv1E5Xx DQIDAQAB -----END PUBLIC KEY----- </Value> </PublicKey>
מציינת את המפתח הציבורי או האישור הציבורי שמשמשים לאימות החתימה ב-JWT. שימוש במאפיין ref כדי מעבירים את המפתח/האישור במשתנה זרימה, או מציינים את המפתח בקידוד PEM באופן ישיר. יש להשתמש רק כאשר הוא אחד מהפרמטרים הבאים: RS256/RS384/RS512 , PS256/PS384/PS512 או ES256/ES384/ES512.
| ברירת מחדל | לא רלוונטי |
| נוכחות | כדי לאמת JWT חתום באמצעות אלגוריתם RSA, עליך להשתמש באישור, JWKS או רכיבי ערך. |
| סוג | מחרוזת |
| ערכים חוקיים | משתנה זרימה או מחרוזת. |
<SecretKey/Value>
<SecretKey encoding="base16|hex|base64|base64url"> <Value ref="private.your-variable-name"/> </SecretKey>
מספקת את המפתח הסודי המשמש לאימות אסימונים או לחתימה עליהם באמצעות אלגוריתם HMAC. שימוש בלבד כאשר האלגוריתם הוא אחד מ-HS256, HS384, HS512.
| ברירת מחדל | לא רלוונטי |
| נוכחות | נדרש לאלגוריתמים של HMAC. |
| סוג | מחרוזת |
| ערכים חוקיים |
בשביל שימוש במאפיין ref כדי להעביר את המפתח במשתנה זרימה. הערה: אם משתנה זרימה, התחילית שלו חייבת להיות "private". לדוגמה,
|
<Source>
<Source>jwt-variable</Source>
אם השדה הזה קיים, הוא מציין את משתנה הזרימה שבו המדיניות מצפה למצוא את ה-JWT לאמת.
| ברירת מחדל | request.header.authorization (מידע חשוב מופיע בהערה שלמעלה
מידע על ברירת המחדל). |
| נוכחות | אופציונלי |
| סוג | מחרוזת |
| ערכים חוקיים | שם משתנה לזרימה של Edge. |
<Subject>
<Subject>subject-string-here</Subject>
המדיניות מאמתת שהנושא ב-JWT תואם למחרוזת שצוינה במדיניות הגדרה אישית. התלונה הזו מזהה את הנושא של ה-JWT או מספקת הצהרה לגביו. הדבר אחת מקבוצת ההצהרות הרגילה שמוזכרת ב-RFC7519.
| ברירת מחדל | לא רלוונטי |
| נוכחות | אופציונלי |
| סוג | מחרוזת |
| ערכים חוקיים | כל ערך שמזהה באופן ייחודי נושא. |
<TimeAllowance>
<TimeAllowance>120s</TimeAllowance>
"תקופת החסד" לפעמים. לדוגמה, אם מגבלת הזמן מוגדרת ל-60 שניות, מסמך JWT שפג תוקפו ייחשב כתנאי בתוקף למשך 60 שניות לאחר תום התקופה המוגדרת. המערכת תעריך באופן דומה את המדד 'לא לפני הזמן'. ברירת המחדל היא 0 שניות (ללא תקופת חסד).
| ברירת מחדל | 0 שניות (ללא תקופת חסד) |
| נוכחות | אופציונלי |
| סוג | מחרוזת |
| ערכים חוקיים |
ערך או הפניה למשתנה זרימה המכיל את הערך. טווחי הזמן יכולים להיות
מוגדר כך:
|
Flow variables
Upon success, the Verify JWT and Decode JWT policies set context variables according to this pattern:
jwt.{policy_name}.{variable_name}
For example, if the policy name is jwt-parse-token , then the policy will store
the subject specified in the JWT to the context variable named jwt.jwt-parse-token.decoded.claim.sub.
(For backward compatibility, it will also be available in jwt.jwt-parse-token.claim.subject)
| Variable name | Description |
|---|---|
claim.audience |
The JWT audience claim. This value may be a string, or an array of strings. |
claim.expiry |
The expiration date/time, expressed in milliseconds since epoch. |
claim.issuedat |
The Date the token was issued, expressed in milliseconds since epoch. |
claim.issuer |
The JWT issuer claim. |
claim.notbefore |
If the JWT includes a nbf claim, this variable will contain the value, expressed in milliseconds since epoch. |
claim.subject |
The JWT subject claim. |
claim.name |
The value of the named claim (standard or additional) in the payload. One of these will be set for every claim in the payload. |
decoded.claim.name |
The JSON-parsable value of the named claim (standard or additional) in the payload. One variable is set for
every claim in the payload. For example, you can use decoded.claim.iat to
retrieve the issued-at time of the JWT, expressed in seconds since epoch. While you
can also use the claim.name flow variables, this is the
recommended variable to use to access a claim. |
decoded.header.name |
The JSON-parsable value of a header in the payload. One variable is set for
every header in the payload. While you can also use the header.name flow variables,
this is the recommended variable to use to access a header. |
expiry_formatted |
The expiration date/time, formatted as a human-readable string. Example: 2017-09-28T21:30:45.000+0000 |
header.algorithm |
The signing algorithm used on the JWT. For example, RS256, HS384, and so on. See (Algorithm) Header Parameter for more. |
header.kid |
The Key ID, if added when the JWT was generated. See also "Using a JSON Web Key Set (JWKS)" at JWT policies overview to verify a JWT. See (Key ID) Header Parameter for more. |
header.type |
Will be set to JWT. |
header.name |
The value of the named header (standard or additional). One of these will be set for every additional header in the header portion of the JWT. |
header-json |
The header in JSON format. |
is_expired |
true or false |
payload-claim-names |
An array of claims supported by the JWT. |
payload-json |
The payload in JSON format.
|
seconds_remaining |
The number of seconds before the token will expire. If the token is expired, this number will be negative. |
time_remaining_formatted |
The time remaining before the token will expire, formatted as a human-readable string. Example: 00:59:59.926 |
valid |
In the case of VerifyJWT, this variable will be true when the signature is verified, and
the current time is before the token expiry, and after the token notBefore value, if they
are present. Otherwise false.
In the case of DecodeJWT, this variable is not set. |
התייחסות לשגיאות
This section describes the fault codes and error messages that are returned and fault variables that are set by Edge when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.
Runtime errors
These errors can occur when the policy executes.
| Fault code | HTTP status | Occurs when |
|---|---|---|
steps.jwt.AlgorithmInTokenNotPresentInConfiguration |
401 | Occurs when the verification policy has multiple algorithms. |
steps.jwt.AlgorithmMismatch |
401 | The algorithm specified in the Generate policy did not match the one expected in the Verify policy. The algorithms specified must match. |
steps.jwt.FailedToDecode |
401 | The policy was unable to decode the JWT. The JWT is possibly corrupted. |
steps.jwt.GenerationFailed |
401 | The policy was unable to generate the JWT. |
steps.jwt.InsufficientKeyLength |
401 | For a key less than 32 bytes for the HS256 algorithm, less than 48 bytes for the HS386 algortithm, and less than 64 bytes for the HS512 algorithm. |
steps.jwt.InvalidClaim |
401 | For a missing claim or claim mismatch, or a missing header or header mismatch. |
steps.jwt.InvalidCurve |
401 | The curve specified by the key is not valid for the Elliptic Curve algorithm. |
steps.jwt.InvalidJsonFormat |
401 | Invalid JSON found in the header or payload. |
steps.jwt.InvalidToken |
401 | This error occurs when the JWT signature verification fails. |
steps.jwt.JwtAudienceMismatch |
401 | The audience claim failed on token verification. |
steps.jwt.JwtIssuerMismatch |
401 | The issuer claim failed on token verification. |
steps.jwt.JwtSubjectMismatch |
401 | The subject claim failed on token verification. |
steps.jwt.KeyIdMissing |
401 | The Verify policy uses a JWKS as a source for public keys, but the signed JWT does not
include a kid property in the header. |
steps.jwt.KeyParsingFailed |
401 | The public key could not be parsed from the given key information. |
steps.jwt.NoAlgorithmFoundInHeader |
401 | Occurs when the JWT contains no algorithm header. |
steps.jwt.NoMatchingPublicKey |
401 | The Verify policy uses a JWKS as a source for public keys, but the kid
in the signed JWT is not listed in the JWKS. |
steps.jwt.SigningFailed |
401 | In GenerateJWT, for a key less than the minimum size for the HS384 or HS512 algorithms |
steps.jwt.TokenExpired |
401 | The policy attempts to verify an expired token. |
steps.jwt.TokenNotYetValid |
401 | The token is not yet valid. |
steps.jwt.UnhandledCriticalHeader |
401 | A header found by the Verify JWT policy in the crit header is not
listed in KnownHeaders. |
steps.jwt.UnknownException |
401 | An unknown exception occurred. |
steps.jwt.WrongKeyType |
401 | Wrong type of key specified. For example, if you specify an RSA key for an Elliptic Curve algorithm, or a curve key for an RSA algorithm. |
Deployment errors
These errors can occur when you deploy a proxy containing this policy.
| Error name | Cause | Fix |
|---|---|---|
InvalidNameForAdditionalClaim |
The deployment will fail if the claim used in the child element <Claim>
of the <AdditionalClaims> element is one of the following registered names:
kid, iss, sub, aud, iat,
exp, nbf, or jti.
|
build |
InvalidTypeForAdditionalClaim |
If the claim used in the child element <Claim>
of the <AdditionalClaims> element is not of type string, number,
boolean, or map, the deployment will fail.
|
build |
MissingNameForAdditionalClaim |
If the name of the claim is not specified in the child element <Claim>
of the <AdditionalClaims> element, the deployment will fail.
|
build |
InvalidNameForAdditionalHeader |
This error ccurs when the name of the claim used in the child element <Claim>
of the <AdditionalClaims> element is either alg or typ.
|
build |
InvalidTypeForAdditionalHeader |
If the type of claim used in the child element <Claim>
of the <AdditionalClaims> element is not of type string, number,
boolean, or map, the deployment will fail.
|
build |
InvalidValueOfArrayAttribute |
This error occurs when the value of the array attribute in the child element <Claim>
of the <AdditionalClaims> element is not set to true or false.
|
build |
InvalidValueForElement |
If the value specified in the <Algorithm> element is not a supported value,
the deployment will fail.
|
build |
MissingConfigurationElement |
This error will occur if the <PrivateKey> element is not used with
RSA family algorithms or the <SecretKey> element is not used with HS Family
algorithms.
|
build |
InvalidKeyConfiguration |
If the child element <Value> is not defined in the <PrivateKey>
or <SecretKey> elements, the deployment will fail.
|
build |
EmptyElementForKeyConfiguration |
If the ref attribute of the child element <Value> of the <PrivateKey>
or <SecretKey> elements is empty or unspecified, the deployment will fail.
|
build |
InvalidConfigurationForVerify |
This error occurs if the <Id> element is defined within the
<SecretKey> element.
|
build |
InvalidEmptyElement |
This error occurs if the <Source> element of the Verify JWT policy
is empty. If present, it must be defined with an Edge flow variable name.
|
build |
InvalidPublicKeyValue |
If the value used in the child element <JWKS> of the <PublicKey> element
does not use a valid format as specified in RFC 7517,
the deployment will fail.
|
build |
InvalidConfigurationForActionAndAlgorithm |
If the <PrivateKey> element is used with HS Family algorithms or
the <SecretKey> element is used with RSA Family algorithms, the
deployment will fail.
|
build |
Fault variables
These variables are set when a runtime error occurs. For more information, see What you need to know about policy errors.
| Variables | Where | Example |
|---|---|---|
fault.name="fault_name" |
fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. | fault.name Matches "TokenExpired" |
JWT.failed |
All JWT policies set the same variable in the case of a failure. | JWT.failed = true |
Example error response
For error handling, the best practice is to trap the errorcode part of the error
response. Do not rely on the text in the faultstring, because it could change.
Example fault rule
<FaultRules>
<FaultRule name="JWT Policy Errors">
<Step>
<Name>JavaScript-1</Name>
<Condition>(fault.name Matches "TokenExpired")</Condition>
</Step>
<Condition>JWT.failed=true</Condition>
</FaultRule>
</FaultRules>