מדיניות אימות JWT

מוצג המסמך של 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 אוכפים פקודות נוספות הגבלות, כגון הסרה אוטומטית של תווים שאינם אלפאנומריים.

אפשר להשתמש ברכיב <displayname></displayname> כדי להוסיף תווית למדיניות בעורך ה-Proxy של ממשק המשתמש לניהול בשפה טבעית אחרת שם.

לא רלוונטי חובה
continueOnError צריך להגדיר את הערך false כדי להחזיר שגיאה כשמדיניות נכשלת. המצב הזה צפוי של רוב כללי המדיניות.

יש להגדיר ל-true כדי שביצוע התהליך יימשך גם לאחר המדיניות נכשל.

false אופציונלי
פעיל צריך להגדיר את הערך true כדי לאכוף את המדיניות.

הגדרת הערך false כ'כיבוי' המדיניות. המדיניות לא תיאכף גם אם הוא נשאר מחובר לזרימה.

true אופציונלי
אסינכרוני המאפיין הזה הוצא משימוש. false הוצא משימוש

&lt;DisplayName&gt;

<DisplayName>Policy Display Name</DisplayName>

שימוש בנוסף למאפיין השם כדי להוסיף תווית למדיניות בעורך ה-Proxy של ממשק המשתמש לניהול בשם אחר בשפה טבעית.

ברירת מחדל אם משמיטים את הרכיב הזה, המערכת תשתמש בערך של מאפיין השם של המדיניות.
נוכחות אופציונלי
סוג מחרוזת

&lt;Algorithm&gt;

<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

&lt;Audience&gt;

<Audience>audience-here</Audience>

or:

<Audience ref='variable-name-here'/>

המדיניות מאמתת שהצהרת הקהל ב-JWT תואמת לערך שצוין ב הגדרה אישית. אם לא נמצאה התאמה, המדיניות גורמת לשגיאה. הצהרה זו מזהה את שאליהם מיועד ה-JWT. זו אחת מהתלונות הרשומות שהוזכרו ב RFC7519.

ברירת מחדל לא רלוונטי
נוכחות אופציונלי
סוג מחרוזת
ערכים חוקיים משתנה זרימה או מחרוזת שמזהים את הקהל.

&lt;AdditionalClaims/Claim&gt;

<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 }
  }
}

&lt;AdditionalHeaders/Claim&gt;

<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 כדי לציין אם הערך הוא מערך של סוגים. ברירת מחדל: לא נכון.

&lt;CustomClaims&gt;

הערה: בשלב הזה, הרכיב CustomClaims מתווסף כשמוסיפים רכיב חדש יצירת מדיניות JWT דרך ממשק המשתמש. הרכיב הזה לא פעיל והמערכת מתעלמת ממנו. השם הנכון במקום זאת, הוא &lt;AdditionalClaims&gt;. ממשק המשתמש יעודכן כדי להוסיף את הרכיבים הנכונים מאוחר יותר.

&lt;Id&gt;

<Id>explicit-jti-value-here</Id>
 -or-
<Id ref='variable-name-here'/>
 -or-
<Id/>

מאמתת של-JWT יש את הצהרת ה-jti הספציפית. כשערך הטקסט וההפניה ריקים, המדיניות תיצור jti שמכיל מזהה ייחודי אקראי. מזהה ה-JWT (jti) הוא מזהה ייחודי של ה-JWT. מידע נוסף על jti זמין בכתובת RFC7519.

ברירת מחדל לא רלוונטי
נוכחות אופציונלי
סוג מחרוזת או הפניה.
ערכים חוקיים מחרוזת או שם של משתנה זרימה המכיל את המזהה.

&lt;IgnoreCriticalHeaders&gt;

<IgnoreCriticalHeaders>true|false</IgnoreCriticalHeaders>

יש להגדיר את הערך False אם רוצים שהמדיניות תגרור שגיאה כשכותרת כלשהי שמופיעה ברשימה הכותרת crit של ה-JWT לא מופיעה ברכיב <KnownHeaders>. יש להגדיר את הערך כ-True כדי לגרום למדיניות VerifyJWT להתעלם מהכותרת crit.

אחת מהסיבות להגדיר את הרכיב הזה כ-True היא אם אתם נמצאים בסביבת בדיקה ועדיין לא מוכן לגרום לכשל בכותרת חסרה.

ברירת מחדל false
נוכחות אופציונלי
סוג בוליאני
ערכים חוקיים נכון או לא נכון

&lt;IgnoreIssuedAt&gt;

<IgnoreIssuedAt>true|false</IgnoreIssuedAt>

יש להגדיר את הערך כ-False (ברירת מחדל) אם רוצים שהמדיניות תגרור שגיאה כש-JWT מכיל הצהרה על זכויות יוצרים מסוג iat (הונפקה בתאריך) שמציינת שעה בעתיד. יש להגדיר את הערך כ-True כדי שהמדיניות תתעלם מ-iat במהלך האימות.

ברירת מחדל false
נוכחות אופציונלי
סוג בוליאני
ערכים חוקיים נכון או לא נכון

&lt;IgnoreUnresolvedVariables&gt;

<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>

יש להגדיר את הערך כ-False אם רוצים שהמדיניות תגרור שגיאה כשמצוין משתנה כלשהו שאליו יש הפניה במדיניות לא ניתן לפתור. צריך להגדיר את הערך כ-True כדי להתייחס לכל משתנה שלא ניתן לפתרון כמחרוזת ריקה (null).

ברירת מחדל false
נוכחות אופציונלי
סוג בוליאני
ערכים חוקיים נכון או לא נכון

&lt;Issuer&gt;

<Issuer ref='variable-name-here'/>
<Issuer>issuer-string-here</Issuer>

המדיניות מאמתת שהמנפיק ב-JWT תואם למחרוזת שצוינה רכיב הגדרה. הצהרה שמזהה את המנפיק של ה-JWT. זהו אחד מ- קבוצת ההצהרות הרשומה שהוזכרה ב-RFC7519.

ברירת מחדל לא רלוונטי
נוכחות אופציונלי
סוג מחרוזת או הפניה
ערכים חוקיים הכול

&lt;KnownHeaders&gt;

<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.

ברירת מחדל לא רלוונטי
נוכחות אופציונלי
סוג מערך מחרוזות מופרדות בפסיקים
ערכים חוקיים מערך או שם של משתנה שמכיל את המערך.

&lt;PublicKey/Certificate&gt;

<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 או רכיבי ערך.
סוג מחרוזת
ערכים חוקיים משתנה זרימה או מחרוזת.

&lt;PublicKey/JWKS&gt;

<!-- 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.

&lt;PublicKey/Value&gt;

<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 או רכיבי ערך.
סוג מחרוזת
ערכים חוקיים משתנה זרימה או מחרוזת.

&lt;SecretKey/Value&gt;

<SecretKey encoding="base16|hex|base64|base64url">
  <Value ref="private.your-variable-name"/>
</SecretKey>

מספקת את המפתח הסודי המשמש לאימות אסימונים או לחתימה עליהם באמצעות אלגוריתם HMAC. שימוש בלבד כאשר האלגוריתם הוא אחד מ-HS256, HS384, HS512.

ברירת מחדל לא רלוונטי
נוכחות נדרש לאלגוריתמים של HMAC.
סוג מחרוזת
ערכים חוקיים

בשביל encoding, הערכים החוקיים הם hex, base16, base64, או base64url. ערכי הקידוד hex ו-base16 הם מילים נרדפות.

שימוש במאפיין ref כדי להעביר את המפתח במשתנה זרימה.

הערה: אם משתנה זרימה, התחילית שלו חייבת להיות "private". לדוגמה, private.mysecret

&lt;Source&gt;

<Source>jwt-variable</Source>

אם השדה הזה קיים, הוא מציין את משתנה הזרימה שבו המדיניות מצפה למצוא את ה-JWT לאמת.

ברירת מחדל request.header.authorization (מידע חשוב מופיע בהערה שלמעלה מידע על ברירת המחדל).
נוכחות אופציונלי
סוג מחרוזת
ערכים חוקיים שם משתנה לזרימה של Edge.

&lt;Subject&gt;

<Subject>subject-string-here</Subject>

המדיניות מאמתת שהנושא ב-JWT תואם למחרוזת שצוינה במדיניות הגדרה אישית. התלונה הזו מזהה את הנושא של ה-JWT או מספקת הצהרה לגביו. הדבר אחת מקבוצת ההצהרות הרגילה שמוזכרת ב-RFC7519.

ברירת מחדל לא רלוונטי
נוכחות אופציונלי
סוג מחרוזת
ערכים חוקיים כל ערך שמזהה באופן ייחודי נושא.

&lt;TimeAllowance&gt;

<TimeAllowance>120s</TimeAllowance>

"תקופת החסד" לפעמים. לדוגמה, אם מגבלת הזמן מוגדרת ל-60 שניות, מסמך JWT שפג תוקפו ייחשב כתנאי בתוקף למשך 60 שניות לאחר תום התקופה המוגדרת. המערכת תעריך באופן דומה את המדד 'לא לפני הזמן'. ברירת המחדל היא 0 שניות (ללא תקופת חסד).

ברירת מחדל 0 שניות (ללא תקופת חסד)
נוכחות אופציונלי
סוג מחרוזת
ערכים חוקיים ערך או הפניה למשתנה זרימה המכיל את הערך. טווחי הזמן יכולים להיות מוגדר כך:
  • s = שניות
  • m = דקות
  • שע' = שעות
  • d = ימים

משתני זרימה

לאחר השלמת התהליך, כללי המדיניות אימות JWT ופענוח קוד 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 התאריך/שעת התפוגה, מבוטא באלפיות השנייה מאז epoch.
claim.issuedat התאריך שבו הונפק האסימון, מבוטא באלפיות שנייה מאז epoch.
claim.issuer הצהרת הבעלות על מנפיק ה-JWT.
claim.notbefore אם ה-JWT כולל הצהרת nbf, המשתנה הזה יכיל את הערך, באלפיות שנייה מאז epoch.
claim.subject הצהרת הנושא של JWT.
claim.name הערך של ההצהרה בעלת השם (רגילה או נוספת) במטען הייעודי (payload). אחד מאלה יוגדר עבור כל הצהרה במטען הייעודי (payload).
decoded.claim.name ערך שניתן לנתח בפורמט JSON של ההצהרה בעלת השם (רגילה או נוספת) במטען הייעודי (payload). משתנה אחד מוגדר עבור כל הצהרה במטען הייעודי (payload). לדוגמה, אפשר להשתמש ב-decoded.claim.iat כדי לאחזר את תאריך ההנפקה של ה-JWT, המבוטא בשניות מאז epoch. בזמן ש הוא גם יכול להשתמש במשתני הזרימה claim.name, המשתנה המומלץ לשימוש כדי לגשת להצהרה על זכויות יוצרים.
decoded.header.name ערך של כותרת שאפשר לנתח בפורמט JSON במטען הייעודי (Payload). משתנה אחד מוגדר עבור כל כותרת במטען הייעודי (payload). אפשר גם להשתמש במשתני הזרימה header.name, זה המשתנה המומלץ שבו צריך להשתמש כדי לגשת לכותרת.
expiry_formatted התאריך/שעת התפוגה בפורמט של מחרוזת שאנשים יכולים לקרוא. דוגמה: 2017-09-28T21:30:45.000+0000
header.algorithm אלגוריתם החתימה שנעשה בו שימוש ב-JWT. לדוגמה, RS256 , HS384 וכן הלאה. מידע נוסף זמין במאמר (Algorithm) Header Parameter.
header.kid מזהה המפתח, אם הוא נוסף בזמן יצירת ה-JWT. ראו גם "שימוש בערכת מפתחות אינטרנט מסוג JSON (JWKS)" ב-JWT סקירה כללית של המדיניות כדי לאמת JWT. מידע נוסף זמין במאמר (Key ID) Header Parameter (פרמטר הכותרת של מזהה המפתח).
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 כשהחתימה תאומת. הזמן הנוכחי הוא לפני תפוגת האסימון, ואחרי הערך לאלפני האסימון, אם קיימים. אחרת, הערך יהיה False.

במקרה של DecodeJWT, המשתנה הזה לא מוגדר.

התייחסות לשגיאות

בקטע הזה מתוארים קודי התקלות והודעות השגיאה שמוחזרים, ומשתני השגיאה שמוגדרים על ידי Edge כשהמדיניות הזו גורמת לשגיאה. חשוב לדעת אם אתם מפתחים כללים לתיקון תקלות. מידע נוסף זמין במאמר מה צריך לדעת על שגיאות מדיניות ועל טיפול בפגמים.

שגיאות בזמן ריצה

השגיאות האלה יכולות להתרחש כשהמדיניות מופעלת.

קוד שגיאה סטטוס HTTP מופיע כאשר
steps.jwt.AlgorithmInTokenNotPresentInConfiguration 401 מופיע כשמדיניות האימות כוללת כמה אלגוריתמים.
steps.jwt.AlgorithmMismatch 401 האלגוריתם שצוין במדיניות היצירה לא תאם לאלגוריתם המצופה במדיניות האימות. האלגוריתמים שצוינו צריכים להתאים.
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.InvalidCurve 401 העקומה שצוינה על ידי המפתח אינה חוקית עבור האלגוריתם 'עקומה אליפטית'.
steps.jwt.InvalidJsonFormat 401 נמצא JSON לא חוקי בכותרת או במטען הייעודי (payload).
steps.jwt.InvalidToken 401 השגיאה הזו מתרחשת כאשר אימות החתימה של JWT נכשל.
steps.jwt.JwtAudienceMismatch 401 תביעת הבעלות על הקהל נכשלה באימות האסימון.
steps.jwt.JwtIssuerMismatch 401 תביעת המנפיק נכשלה בתהליך אימות האסימון.
steps.jwt.JwtSubjectMismatch 401 תביעת הבעלות על הנושא נכשלה באימות האסימון.
steps.jwt.KeyIdMissing 401 במדיניות האימות נעשה שימוש ב-JWKS כמקור למפתחות ציבוריים, אבל ה-JWT החתום לא כולל נכס kid בכותרת.
steps.jwt.KeyParsingFailed 401 לא ניתן היה לנתח את המפתח הציבורי מפרטי המפתח שצוינו.
steps.jwt.NoAlgorithmFoundInHeader 401 מופיע כשה-JWT לא מכיל כותרת אלגוריתם.
steps.jwt.NoMatchingPublicKey 401 במדיניות האימות נעשה שימוש ב-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 לאלגוריתם Elliptic Curve, או מפתח עקומה לאלגוריתם RSA.

שגיאות בפריסה

השגיאות האלה יכולות להתרחש כשפורסים שרת proxy שכולל את המדיניות הזו.

שם השגיאה סיבה תיקון
InvalidNameForAdditionalClaim הפריסה תיכשל אם ההצהרה שנעשה בה שימוש ברכיב הצאצא <Claim> של הרכיב <AdditionalClaims> היא אחד מהשמות הרשומים הבאים: kid, iss, sub, aud, iat, exp, nbf או jti.
InvalidTypeForAdditionalClaim אם ההצהרה שנעשה בה שימוש ברכיב הצאצא <Claim> של הרכיב <AdditionalClaims> אינה מסוג string, number, boolean או map, הפריסה תיכשל.
MissingNameForAdditionalClaim אם שם ההצהרה לא צוין ברכיב הצאצא <Claim> של הרכיב <AdditionalClaims>, הפריסה תיכשל.
InvalidNameForAdditionalHeader השגיאה הזו נשלחת כאשר שם הצהרת זכויות היוצרים ברכיב הצאצא <Claim> של הרכיב <AdditionalClaims> הוא alg או typ.
InvalidTypeForAdditionalHeader אם סוג התביעה שבו נעשה שימוש ברכיב הצאצא <Claim> של הרכיב <AdditionalClaims> אינו מסוג string, number, boolean או map, הפריסה תיכשל.
InvalidValueOfArrayAttribute השגיאה הזו מתרחשת כאשר הערך של מאפיין המערך ברכיב הצאצא <Claim> של הרכיב <AdditionalClaims> לא מוגדר ל-true או ל-false.
InvalidValueForElement אם הערך שצוין ברכיב <Algorithm> אינו ערך נתמך, הפריסה תיכשל.
MissingConfigurationElement השגיאה הזו תופיע אם לא משתמשים ברכיב <PrivateKey> בשילוב עם אלגוריתמים ממשפחת RSA, או אם לא משתמשים ברכיב <SecretKey> באלגוריתמים של משפחת HS.
InvalidKeyConfiguration אם רכיב הצאצא <Value> לא מוגדר ברכיבים <PrivateKey> או <SecretKey>, הפריסה תיכשל.
EmptyElementForKeyConfiguration אם מאפיין ה-ref של אלמנט הצאצא <Value> מתוך הרכיבים <PrivateKey> או <SecretKey> ריק או שלא צוין, הפריסה תיכשל.
InvalidConfigurationForVerify השגיאה הזו מופיעה אם הרכיב <Id> מוגדר בתוך הרכיב <SecretKey>.
InvalidEmptyElement השגיאה הזו מתרחשת אם הרכיב <Source> של המדיניות 'אימות JWT' ריק. אם היא קיימת, יש להגדיר אותה עם שם משתנה של זרימה ב-Edge.
InvalidPublicKeyValue אם הערך המשמש ברכיב הצאצא <JWKS> של הרכיב <PublicKey> אינו בפורמט חוקי כפי שצוין ב-RFC 7517, הפריסה תיכשל.
InvalidConfigurationForActionAndAlgorithm אם נעשה שימוש ברכיב <PrivateKey> עם אלגוריתמים של Family HS או אם נעשה שימוש באלמנט <SecretKey> עם אלגוריתמים של משפחת RSA, הפריסה תיכשל.

משתני כשל

המשתנים האלה מוגדרים כשמתרחשת שגיאה בסביבת זמן הריצה. מידע נוסף זמין במאמר מה צריך לדעת? על שגיאות שקשורות למדיניות.

משתנים איפה דוגמה
fault.name="fault_name" fault_name הוא שם השגיאה, כפי שמצוין בטבלה שגיאות זמן ריצה שלמעלה. שם השגיאה הוא החלק האחרון בקוד השגיאה. fault.name Matches "TokenExpired"
JWT.failed כל כללי המדיניות של JWT מגדירים את אותו משתנה במקרה של כשל. JWT.failed = true

דוגמה לתגובת שגיאה

קודי תקלות במדיניות JWT

לטיפול בשגיאות, השיטה המומלצת היא להעתיק את החלק errorcode של השגיאה תשובה. אין להסתמך על הטקסט שבfaultstring, כי הוא עשוי להשתנות.

דוגמה לכלל שגוי

    <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>