< All Topics
Print

שליפת נתונים מתוך JWT

מהו JWT?

משמעות המושג JWT הינו JSON Web Token.
מדובר על הצפנת נתונים ב-jSON בכדי לבצע אימות, למשל של פרטי משתמש.
JWT הינו טוקן, כאשר ניתן לחלץ מתוכו שדות מסוימים, לפי הצורך.
להלן דוגמה ל-Request המכיל בתוכו JWT:

{
    "cfCookie": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImI1OWMwY2JmNjg2ZmZiMmY5NTNkY2U5MGY2MzFhNjFlMzExMDJiOTZkZWJlMjNlZDY2NTdiZjQxMzlmZTI0MjIifQ.eyJhdWQiOlsiY2Y0YWVkMDk3NGIyNTFjZDMyODIwMWRkYTI0M2Q1ZGIzOTg0ODVlM2E4YWE0MDlkZDg1NjAyN2MwMzhjYWIwNCJdLCJlbWFpbCI6ImVkYW50QGNvbnNpc3QuY28uaWwiLCJleHAiOjE3Mjk2NzE3MjAsImlhdCI6MTcyOTU4NTMyMCwibmJmIjoxNzI5NTg1MzIwLCJpc3MiOiJodHRwczovL2NvbnNpc3QtZGV2LmNsb3VkZmxhcmVhY2Nlc3MuY29tIiwidHlwZSI6ImFwcCIsImlkZW50aXR5X25vbmNlIjoiWFBWM0w3QWlTdkxpcGUxYyIsInN1YiI6IjhiOTc5YTNiLTY2NzctNWUwZi04NTMwLWEzMGFiZGQ0YTBlOSIsImNvdW50cnkiOiJJTCJ9.kP667ZgWqGIIaF1wIoP3HqCf_JxB-QJBGlPuQkWOpwh04D4VDZMgRNU-a5SJcHvtHVQGyZEgdAIShdB2gT6q9YQ-sin1lIfXo47VLULTBf518K3RoaWXz2O5wX4IUlOgw1OyOnJoAM3NDfYO5P9wMZgaD9Vz62e_1tjFVLX7yz0ygykid-N85fTJ476f2_WSUTf7vHQY6rCVWioEAJlf_EwllWkw9VsmiOOQpfQUWj7plZ2RICU1BImOk9u4bn4PJu4SxtNQSeaabaY9sTcnV1yXdv7qUBubseHDAKalOM7CfhhwLOTHryJVNqOWBa7VdztomMufMHdceW5JVLET8w"
}

אם ניקח את הטוקן לעיל לאתר jwt.io, נעתיק את החלק של הטוקן ל-Encoded, נוכל לראות בחלק של ה-Decoded את השדות המוצפנים בתוכו.


ביצוע Decode ל-JWT

על מנת שנוכל לחלץ שדה או מספר שדות מתוך ה-JWT, נדרש תחילה לשמור את הטוקן מה-Request:

<property expression="json-eval($.cfCookie)" name="cfCookie" scope="default" type="STRING"/>

לצורך הדוגמה, ניצור את ה-Sequence הבא:

&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;sequence name="getJwtUserName" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
    &lt;!-- Extract the payload part from the JWT (cfCookie) using substring manipulation -->
    &lt;property expression="get-property('cfCookie')" name="jwtPayload" scope="default" type="STRING"/>
    &lt;property expression="fn:substring-before(fn:substring-after(get-property('jwtPayload'), '.'), '.')" name="jwtPayload" scope="default" type="STRING"/>
    &lt;!-- Decode the JWT (jwtPayload) from Base64 encoded payload -->
    &lt;property expression="base64Decode(get-property('jwtPayload'))" name="decodedPayload" scope="default" type="STRING"/>
    &lt;!-- Parse the decoded JWT payload as JSON -->
    &lt;property expression="json-eval(get-property('decodedPayload'))" name="decodedPayloadJson" scope="default" type="STRING"/>
    &lt;payloadFactory media-type="json">
        &lt;format>
			     $1
		  &lt;/format>
        &lt;args>
            &lt;arg evaluator="xml" expression="get-property('decodedPayload')"/>
        &lt;/args>
    &lt;/payloadFactory>
    &lt;!-- Extract the 'email' field and save it as 'userNameFull' (full email) -->
    &lt;property expression="json-eval($.email)" name="userNameFull" scope="default" type="STRING"/>
    &lt;property expression="fn:substring-before(get-property('userNameFull'), '@')" name="userName" scope="default" type="STRING"/>
&lt;/sequence>

בדוגמה לעיל, ביצענו את הפעולות הבאות:

  • יצרנו Property חדש שנקרא jwtPayload, התוכן שלו יכיל את הטוקן.
  • כעת נרצה לשלוף חלק ספציפי של השדות (ללא ה-Header) מתוך ה־JWT המאוחסן בתוך ב-Property שיצרנו.
    לכן, נשתמש בפונקציה fn:substring-after(..., '.') – תפקידה לשלוף את התוכן שמגיע אחרי הנקודה הראשונה ב־JWT.
    פעולה זו מדלגת על ה־Header של ה־JWT. (מדובר על החלק באדום ב-Encoded של התמונה לעיל)
  • לאחר מכן, נרצה לפענח את התוכן המקודד של ה־Payload מתוך JWT.
    לשם כך נבצע Decode (מ-Base64) ל-Payload.
  • כעת נראה להציג את ה-Payload בפורמט של jSON, לכן נצטרך לבצע המרה .
  • סיום נציג Payloadfactory של תוכן ה-Payload של ה-JWT.

לאחר כל הפעולות לעיל, נשמור מה-Payload שדה email אך ניקח רק את חלקו השמאלי של האימייל בכדי לשמור את שם המשתמש.
כלומר, במקום המייל [email protected], נשמור property בשם userName שיכיל את הערך 'edant'.

תוכן עיניינים