درحال مشاهده اسناد Apigee Edge هستید.
به
اسناد Apigee X بروید. اطلاعات
چه
امضای JWT دریافتی از کارخواهها یا سیستمهای دیگر را تأیید میکند. این خطمشی همچنین ادعاها را در متغیرهای زمینهای استخراج میکند تا خطمشیها یا شرایط بعدی بتوانند آن مقادیر را بررسی کنند و تصمیمات مربوط به مجوز یا مسیریابی را اتخاذ کنند. برای آشنایی دقیقتر، نمای کلی خطمشیهای JWS و JWT را ببینید.
وقتی این خطمشی اجرا میشود، Edge امضای JWT را درستیسنجی میکند و درستیسنجی میکند که JWT براساس زمانهای انقضا و قبلاز آن معتبر باشد (درصورت وجود). خطمشی میتواند بهصورت اختیاری مقادیر ادعاهای خاص در JWT را نیز تأیید کند، مانند موضوع، صادرکننده، مخاطب، یا مقدار ادعاهای اضافی.
اگر JWT تأیید و معتبر باشد، همه ادعاهای موجود در JWT به متغیرهای زمینهای برای استفاده توسط خطمشیها یا شرایط بعدی استخراج میشوند و درخواست اجازه مییابد ادامه یابد. اگر امضای JWT قابلتأیید نباشد یا اگر JWT بهدلیل یکی از مُهر زمانها نامعتبر باشد، همه پردازشها متوقف میشود و خطایی در پاسخ برگردانده میشود.
برای آشنایی با بخشهای JWT و نحوه رمزگذاری و امضای آنها، به RFC7519 مراجعه کنید.
ویدیو
برای آشنایی با نحوه درستیسنجی امضا در JWT، یک ویدیو کوتاه تماشا کنید.
نمونهها
درستیسنجی کردن JWT امضاشده با الگوریتم HS256
این خطمشی نمونه یک JWT را که با الگوریتم رمزگذاری HS256، HMAC
بااستفاده از یک کنترل مجموع SHA-256 امضا شده است، تأیید میکند. JWT بااستفاده از پارامتر فرمی بهنام
jwt در درخواست پراکسی ارسال میشود. کلید در متغیری بهنام private.secretkey قرار دارد.
برای دیدن نمونه کامل، ازجمله نحوه درخواست برای خطمشی، ویدیو بالا را ببینید.
پیکربندی خطمشی شامل اطلاعاتی است که Edge برای رمزگشایی و ارزیابی JWT به آنها نیاز دارد، مثل اینکه JWT را کجا پیدا کند (در متغیر جاریسازی مشخصشده در عنصر «منبع»)، الگوریتم امضای موردنیاز، کلید رمز را کجا پیدا کند (ذخیرهشده در متغیر جاریسازی 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>این خطمشی برونداد خود را در متغیرهای زمینهای مینویسد تا خطمشیها یا شرایط بعدی در پراکسی API بتوانند آن مقادیر را بررسی کنند. برای فهرست متغیرهای تنظیمشده توسط این خطمشی، متغیرهای جاریسازی را ببینید.
درستیسنجی کردن JWT امضاشده با الگوریتم RS256
این خطمشی نمونه یک JWT را که با الگوریتم RS256 امضا شده است تأیید میکند. برای درستیسنجی،
باید کلید عمومی را ارائه دهید. JWT بااستفاده از پارامتر فرمی بهنام 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 با همان سرایند اما با این پایهبار …
{
"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» که در پیکربندی خطمشی مشخص شده است مطابقت ندارد.
این خطمشی برونداد خود را در متغیرهای زمینهای مینویسد تا خطمشیها یا شرایط بعدی در پراکسی 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 تنظیم کنید. این رفتار برای اکثر خطمشیها
قابلانتظار است.
روی |
نادرست | اختیاری |
| فعال شد |
برای اجرای خطمشی، روی true تنظیم کنید.
برای «خاموش کردن» خطمشی، روی |
درست | اختیاری |
| غیرهمگام | این مشخصه منسوخ شده است. | نادرست | منسوخ |
<DisplayName>
<DisplayName>Policy Display Name</DisplayName>
علاوهبر مشخصه نام، از این مشخصه برای برچسبگذاری خطمشی در ویرایشگر پراکسی واسط کاربر مدیریت با نامی متفاوت به زبان طبیعی استفاده کنید.
| پیشفرض | اگر این عنصر را حذف کنید، از مقدار مشخصه نام خطمشی استفاده میشود. |
| حضور | اختیاری |
| تایپ کردن | رشته |
<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 نیست. مقدار ادعای اضافی میتواند رشته، عدد، بولی، نقشه، یا آرایه باشد. نقشه بهسادگی مجموعهای از جفتهای نام/مقدار است. مقدار ادعای هریک از این انواع میتواند بهطور صریح در پیکربندی خطمشی یا بهطور غیرمستقیم ازطریق ارجاع به متغیر جریان مشخص شود.
| پیشفرض | موجود نیست |
| حضور | اختیاری |
| تایپ کردن | رشته، عدد، بولی، یا نقشه |
| آرایه | برای نشان دادن اینکه مقدار آرایهای از انواع است، روی درست تنظیم کنید. پیشفرض: نادرست |
| مقادیر معتبر | هر مقداری که میخواهید برای یک ادعای اضافی استفاده کنید. |
عنصر <Claim> این مشخصهها را میپذیرد:
- نام - (الزامی) نام دعوی.
- ref - (اختیاری) نام متغیر جاری. اگر وجود داشته باشد، خطمشی از مقدار این متغیر بهعنوان ادعا استفاده خواهد کرد. اگر هم مشخصه ref و هم مقدار ادعای صریح مشخص شده باشد، مقدار صریح مقدار پیشفرض است و اگر متغیر جاریسازی ارجاعدادهشده حلنشده باشد، استفاده میشود.
- نوع - (اختیاری) یکی از این موارد: رشته (پیشفرض)، عدد، مقدار منطقی، یا نقشه
- آرایه - (اختیاری) برای نشان دادن اینکه مقدار آرایهای از انواع است، روی درست تنظیم کنید. پیشفرض: نادرست.
وقتی عنصر <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 نیست. مقدار ادعای اضافی میتواند رشته، عدد، بولی، نقشه، یا آرایه باشد. نقشه بهسادگی مجموعهای از جفتهای نام/مقدار است. مقدار ادعای هریک از این انواع را میتوان بهطور صریح در پیکربندی خطمشی یا بهطور غیرمستقیم ازطریق ارجاع به متغیر جریان مشخص کرد.
| پیشفرض | موجود نیست |
| حضور | اختیاری |
| تایپ کردن |
رشته (پیشفرض)، عدد، بولی، یا نقشه. اگر نوعی مشخص نشده باشد، نوع بهطور پیشفرض «رشته» است. |
| آرایه | برای نشان دادن اینکه مقدار آرایهای از انواع است، روی درست تنظیم کنید. پیشفرض: نادرست |
| مقادیر معتبر | هر مقداری که میخواهید برای یک ادعای اضافی استفاده کنید. |
عنصر <Claim> این مشخصهها را میپذیرد:
- نام - (الزامی) نام دعوی.
- ref - (اختیاری) نام متغیر جاری. اگر وجود داشته باشد، خطمشی از مقدار این متغیر بهعنوان ادعا استفاده خواهد کرد. اگر هم مشخصه ref و هم مقدار ادعای صریح مشخص شده باشد، مقدار صریح مقدار پیشفرض است و اگر متغیر جاریسازی ارجاعدادهشده حلنشده باشد، استفاده میشود.
- نوع - (اختیاری) یکی از این موارد: رشته (پیشفرض)، عدد، مقدار منطقی، یا نقشه
- آرایه - (اختیاری) برای نشان دادن اینکه مقدار آرایهای از انواع است، روی درست تنظیم کنید. پیشفرض: نادرست.
<CustomClaims>
توجه: درحالحاضر، وقتی خطمشی GenerateJWT جدیدی را ازطریق رابط کاربری اضافه میکنید، عنصر CustomClaims درج میشود. این عنصر عملکردی نیست و نادیده گرفته میشود. عنصر صحیح برای استفاده بهجای آن <AdditionalClaims> است. رابط کاربری در زمان دیگری بهروز خواهد شد تا عناصر صحیح را درج کند.
<Id>
<Id>explicit-jti-value-here</Id> -or- <Id ref='variable-name-here'/> -or- <Id/>
تأیید میکند که JWT ادعای jti خاص را دارد. وقتی مقدار نوشتاری و مشخصه ref هر دو خالی باشند، خطمشی یک jti حاوی UUID تصادفی تولید میکند. ادعای شناسه JWT (jti) یک شناسه یکتا برای JWT است. برای کسب اطلاعات بیشتر درباره jti، به RFC7519 مراجعه کنید.
| پیشفرض | موجود نیست |
| حضور | اختیاری |
| تایپ کردن | رشته یا مرجع. |
| مقادیر معتبر | یا رشته یا نام متغیر جریانی که حاوی شناسه است. |
<IgnoreCriticalHeaders>
<IgnoreCriticalHeaders>true|false</IgnoreCriticalHeaders>
اگر میخواهید وقتی هریک از سرایندهای فهرستشده در سرایند
crit مربوط به JWT در عنصر <KnownHeaders> فهرست نشده است، خطمشی خطا ایجاد کند، روی false تنظیم کنید.
برای اینکه خطمشی VerifyJWT سرصفحه crit را نادیده بگیرد، روی درست تنظیم کنید.
یکی از دلایل تنظیم این عنصر روی درست این است که اگر در محیط آزمایشی هستید و هنوز آماده نیستید باعث ایجاد خطا در سرایند ازدسترفته شوید.
| پیشفرض | نادرست |
| حضور | اختیاری |
| تایپ کردن | بولی |
| مقادیر معتبر | درست یا نادرست |
<IgnoreIssuedAt>
<IgnoreIssuedAt>true|false</IgnoreIssuedAt>
اگر میخواهید خطمشی درصورتیکه JWT حاوی ادعای
iat (صادرشده در) باشد که زمان آینده را مشخص میکند، خطا ایجاد کند، آن را روی false (پیشفرض) تنظیم کنید.
برای اینکه خطمشی باعث شود iat درستیسنجی نادیده گرفته شود، روی «درست» تنظیم کنید.
| پیشفرض | نادرست |
| حضور | اختیاری |
| تایپ کردن | بولی |
| مقادیر معتبر | درست یا نادرست |
<IgnoreUnresolvedVariables>
<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>
اگر میخواهید وقتی هریک از متغیرهای ارجاعشده مشخصشده در خطمشی غیرقابلحل است، خطمشی خطا ایجاد کند، آن را روی «نادرست» تنظیم کنید. برای اینکه هر متغیر غیرقابلحلی بهعنوان رشته خالی (تهی) درنظر گرفته شود، روی درست تنظیم کنید.
| پیشفرض | نادرست |
| حضور | اختیاری |
| تایپ کردن | بولی |
| مقادیر معتبر | درست یا نادرست |
<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 (JWKS) برای تأیید JWT را ببینید.
اگر مقدار را از نشانی وب عمومی واکشی کنید، Edge مقدار JWKS را برای مدت ۳۰۰ ثانیه در حافظه نهان ذخیره میکند. وقتی حافظه نهان منقضی میشود، Edge دوباره JWKS را واکشی میکند.
| پیشفرض | موجود نیست |
| حضور | برای درستیسنجی JWT بااستفاده از الگوریتم RSA، باید از عنصر «گواهینامه»، «مجموعه کلید وب جاوااسکریپت»، یا «مقدار» استفاده کنید. |
| تایپ کردن | رشته |
| مقادیر معتبر | متغیر جریان، مقدار رشتهای، یا نشانی وب. |
<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 برای انتقال کلید در متغیر جاری استفاده کنید. توجه: اگر متغیر جاری است، باید پیشوند «خصوصی» داشته باشد. برای مثال،
|
<Source>
<Source>jwt-variable</Source>
درصورت وجود، متغیر جریانی را مشخص میکند که خطمشی انتظار دارد JWT را در آن پیدا کند تا درستیسنجی کند.
| پیشفرض | request.header.authorization (برای اطلاعات مهم درباره پیشفرض، یادداشت بالا را ببینید). |
| حضور | اختیاری |
| تایپ کردن | رشته |
| مقادیر معتبر | نام متغیر جریان Edge. |
<Subject>
<Subject>subject-string-here</Subject>
خطمشی تأیید میکند که موضوع در JWT با رشته مشخصشده در پیکربندی خطمشی مطابقت دارد. این ادعا موضوع JWT را شناسایی میکند یا بیانیهای درباره آن ارائه میدهد. این یکی از مجموعه استاندارد ادعاهای ذکرشده در RFC7519 است.
| پیشفرض | موجود نیست |
| حضور | اختیاری |
| تایپ کردن | رشته |
| مقادیر معتبر | هر مقداری که موضوع را بهصورت یکتا شناسایی کند. |
<TimeAllowance>
<TimeAllowance>120s</TimeAllowance>
«مهلت ارفاقی» برای زمانها. برای مثال، اگر زمان مجاز روی ۶۰ ثانیه پیکربندی شده باشد، JWT منقضیشده تا ۶۰ ثانیه پساز انقضای ادعاشده همچنان معتبر درنظر گرفته میشود. زمان not-before-time به همین شکل ارزیابی خواهد شد. بهطور پیشفرض روی ۰ ثانیه (بدون دوره ارفاق) تنظیم میشود.
| پیشفرض | ۰ ثانیه (بدون دوره ارفاق) |
| حضور | اختیاری |
| تایپ کردن | رشته |
| مقادیر معتبر |
مقدار یا مرجعی به متغیر جریانی که حاوی مقدار است. محدودههای زمانی را میتوان
بهصورت زیر مشخص کرد:
|
متغیرهای جریان
پس از موفقیت، سیاست های 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 | تاریخ انتشار توکن، که از آن دوره برحسب میلی ثانیه بیان میشود. |
claim.issuer | ادعای صادرکننده JWT. |
claim.notbefore | اگر JWT شامل یک ادعای nbf باشد، این متغیر حاوی مقداری خواهد بود که از آن دوره در میلی ثانیه بیان شده است. |
claim.subject | ادعای موضوع JWT. |
claim. name | ارزش ادعای نامگذاری شده (استاندارد یا اضافی) در بار. یکی از اینها برای هر ادعا در محموله تنظیم می شود. |
decoded.claim. name | مقدار JSON قابل تجزیه ادعای نامگذاری شده (استاندارد یا اضافی) در بار. برای هر ادعا در محموله یک متغیر تنظیم شده است. برای مثال، میتوانید از decoded.claim.iat برای بازیابی زمان صدور JWT، که بر حسب ثانیه از آن دوره بیان میشود، استفاده کنید. در حالی که می توانید از claim. name متغیرهای جریان، این متغیر توصیه شده برای دسترسی به ادعا است. |
decoded.header. name | مقدار قابل تجزیه JSON یک هدر در بار. یک متغیر برای هر هدر در محموله تنظیم شده است. در حالی که می توانید از header. name متغیرهای جریان، این متغیر پیشنهادی برای استفاده برای دسترسی به هدر است. |
expiry_formatted | تاریخ/زمان انقضا، به عنوان یک رشته قابل خواندن توسط انسان قالب بندی شده است. مثال: 2017-09-28T21:30:45.000+0000 |
header.algorithm | الگوریتم امضای مورد استفاده در JWT. به عنوان مثال، RS256، HS384، و غیره. برای اطلاعات بیشتر به پارامتر سرصفحه (الگوریتم) مراجعه کنید. |
header.kid | شناسه کلید، اگر هنگام تولید JWT اضافه شود. همچنین به «استفاده از مجموعه کلیدهای وب JSON (JWKS)» در نمای کلی خطمشیهای JWT برای تأیید JWT مراجعه کنید. برای اطلاعات بیشتر به پارامتر سرصفحه (شناسه کلید) مراجعه کنید. |
header.type | روی JWT تنظیم خواهد شد. |
header. name | مقدار هدر نامگذاری شده (استاندارد یا اضافی). یکی از اینها برای هر هدر اضافی در قسمت هدر JWT تنظیم می شود. |
header-json | هدر با فرمت JSON. |
is_expired | درست یا نادرست |
payload-claim-names | مجموعه ای از ادعاهای پشتیبانی شده توسط JWT. |
payload-json | محموله در قالب JSON. |
seconds_remaining | تعداد ثانیه های قبل از توکن منقضی می شود. اگر توکن منقضی شده باشد، این عدد منفی خواهد بود. |
time_remaining_formatted | زمان باقیمانده تا توکن منقضی میشود که بهصورت رشتهای قابل خواندن توسط انسان قالببندی شده است. مثال: 00:59:59.926 |
valid | در مورد VerifyJWT، این متغیر زمانی درست خواهد بود که امضا تایید شود، و زمان فعلی قبل از انقضای توکن است و بعد از مقدار notBefore توکن، در صورت وجود. در غیر این صورت نادرست. در مورد 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 | برای کلیدی کمتر از ۳۲ بایت برای الگوریتم HS256، کمتر از ۴۸ بایت برای الگوریتم HS386، و کمتر از ۶۴ بایت برای الگوریتم HS512. |
steps.jwt.InvalidClaim |
401 | برای ادعای مالکیت گمشده یا عدم تطابق ادعای مالکیت، یا سرایند گمشده یا عدم تطابق سرایند. |
steps.jwt.InvalidCurve |
401 | منحنی مشخصشده توسط کلید برای الگوریتم «منحنی بیضوی» معتبر نیست. |
steps.jwt.InvalidJsonFormat |
401 | JSON نامعتبر در سرایند یا پایهبار پیدا شد. |
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 را برای الگوریتم «منحنی بیضوی» یا کلید منحنی را برای الگوریتم RSA مشخص کنید. |
خطاهای استقرار
این خطاها ممکن است زمانی رخ دهند که یک پراکسی حاوی این خطمشی را مستقر میکنید.
| نام خطا | علت | رفع اشکال |
|---|---|---|
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> خطمشی «درستیسنجی JWT»
خالی باشد، این خطا رخ میدهد. اگر وجود داشته باشد، باید با نام متغیر جریان Edge تعریف شود.
|
build |
InvalidPublicKeyValue |
اگر مقدار استفادهشده در عنصر فرزند <JWKS> عنصر <PublicKey>
از قالب معتبری که در RFC 7517 مشخص شده است استفاده نکند،
استقرار ناموفق خواهد بود.
|
build |
InvalidConfigurationForActionAndAlgorithm |
اگر عنصر <PrivateKey> با الگوریتمهای «خانواده HS» استفاده شود یا
عنصر <SecretKey> با الگوریتمهای «خانواده RSA» استفاده شود،
استقرار ناموفق خواهد بود.
|
build |
متغیرهای خطا
این متغیرها زمانی تنظیم می شوند که یک خطای زمان اجرا رخ دهد. برای اطلاعات بیشتر، به آنچه باید در مورد خطاهای خط مشی بدانید مراجعه کنید.
| متغیرها | کجا | مثال |
|---|---|---|
fault.name=" fault_name " | fault_name نام خطا است، همانطور که در جدول خطاهای Runtime در بالا ذکر شده است. نام خطا آخرین قسمت کد خطا است. | fault.name Matches "TokenExpired" |
JWT.failed | همه خط مشی های JWT متغیرهای یکسانی را در صورت خرابی تنظیم می کنند. | JWT.failed = true |
نمونه پاسخ خطا
برای رسیدگی به خطا، بهترین روش به دام انداختن قسمت 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>