מה תרצה/י לחפש?
שליפת נתונים מתוך 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 הבא:
<?xml version="1.0" encoding="UTF-8"?>
<sequence name="getJwtUserName" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
<!-- Extract the payload part from the JWT (cfCookie) using substring manipulation -->
<property expression="get-property('cfCookie')" name="jwtPayload" scope="default" type="STRING"/>
<property expression="fn:substring-before(fn:substring-after(get-property('jwtPayload'), '.'), '.')" name="jwtPayload" scope="default" type="STRING"/>
<!-- Decode the JWT (jwtPayload) from Base64 encoded payload -->
<property expression="base64Decode(get-property('jwtPayload'))" name="decodedPayload" scope="default" type="STRING"/>
<!-- Parse the decoded JWT payload as JSON -->
<property expression="json-eval(get-property('decodedPayload'))" name="decodedPayloadJson" scope="default" type="STRING"/>
<payloadFactory media-type="json">
<format>
$1
</format>
<args>
<arg evaluator="xml" expression="get-property('decodedPayload')"/>
</args>
</payloadFactory>
<!-- Extract the 'email' field and save it as 'userNameFull' (full email) -->
<property expression="json-eval($.email)" name="userNameFull" scope="default" type="STRING"/>
<property expression="fn:substring-before(get-property('userNameFull'), '@')" name="userName" scope="default" type="STRING"/>
</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'.