عیب‌یابی خطای زمان اجرای رمز وب JSON

درحال مشاهده اسناد Apigee Edge هستید.
به اسناد Apigee X بروید.
اطلاعات

FailedToDecode

کد خطا

steps.jwt.FailedToDecode

متن پاسخ خطا

{
  "fault": {
    "faultstring": "Failed to Decode Token: policy({0})",
    "detail": {
       "errorcode": "steps.jwt.FailedToDecode"
     }
  }
}

علت

این خطا زمانی رخ می‌دهد که کد وب JSON (JWT) مشخص‌شده در عنصر <Source> خط‌مشی «رمزگشایی کد وب JSON» بدساخته، نامعتبر، یا به‌هر دلیلی رمزگشایی‌ناپذیر باشد.

‫JWT ساختارمند مناسب باید حاوی سرصفحه، بار، و امضا در قالب زیر باشد: header.payload.signature. اگر JWT ارسال‌شده به خط‌مشی DecodeJWT فاقد بخش مؤلفه باشد، خطا دریافت خواهید کرد. برای مثال، اگر JWT فقط payload.signature را داشته باشد، اما header آن موجود نباشد، خطا رخ خواهد داد.

تشخیص

  1. متغیر مشخص‌شده در عنصر <Source> خط‌مشی «رمزگشایی JWT» را شناسایی کنید. این متغیر باید حاوی JWT باشد.

    در اینجا نمونه‌ای از خط‌مشی «رمزگشایی JWT» آورده شده است:

    <DecodeJWT name="JWT-Decode-HS256">
        <DisplayName>JWT Verify HS256</DisplayName>
        <Source>request.header.authorization</Source>
        <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    </DecodeJWT>
    

    در مثال بالا، JWT باید در سرایند درخواست «مجوز» قرار گیرد.

  2. متغیر شناسایی‌شده در «مرحله ۱» را بررسی کنید و ببینید آیا JWT موجود در آن معتبر است یا نه. اگر JWT ورودی معتبر نباشد، دلیل خطا همین است.

    در درخواست API مثال زیر، JWT ورودی در سرصفحه درخواست «مجوز» ارسال می‌شود:

    curl -v "http://<org>-<env>.apigee.net/v1/decodeJWT" -H "Authorization: Bearer eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"
    

    بررسی دقیق JWT نشان می‌دهد که قالب آن payload.signature است که نامعتبر است. قالب موردانتظار JWT‏ header.payload.signature است. در نتیجه، خط‌مشی «رمزگشایی JWT» با این خطا ناموفق می‌شود :

    "faultstring": "Failed to Decode Token: policy({0})"
    

وضوح

مطمئن شوید که JWT ارسال‌شده به خط‌مشی «رمزگشایی JWT» حاوی هر سه عنصر باشد، قالب‌بندی صحیح داشته باشد، و قابل رمزگشایی باشد.

برای اصلاح مثال نشان‌داده‌شده در بالا، می‌توانید JWT معتبری را با قالب header.payload.signature ارسال کنید. این کار را می‌توان با انجام تماس «میانای برنامه‌سازی کاربردی» بااستفاده از دستور cURL به‌صورت زیر انجام داد:

curl -v "http://<org>-<env>.apigee.net/v1/decodeJWT" -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"

InvalidToken

کد خطا

steps.jwt.InvalidToken

متن پاسخ خطا

{
  "fault": {
    "faultstring": "Invalid token: policy({0})",
    "detail": {
      "errorcode": "steps.jwt.InvalidToken"
     }
  }
}

علت

این خطا زمانی رخ می‌دهد که متغیر جاری مشخص‌شده در عنصر <Source> خط‌مشی «رمزگشایی JWT» این‌گونه باشد:

  • خارج از محدوده (در جریان خاصی که خط‌مشی در آن اجرا می‌شود دردسترس نیست) یا
  • قابل‌حل نیست (تعریف نشده است)

تشخیص

  1. متغیر مشخص‌شده در عنصر <Source> خط‌مشی «رمزگشایی JWT» را شناسایی کنید. این متغیر باید حاوی JWT باشد.

    در اینجا نمونه‌ای از خط‌مشی «رمزگشایی JWT» آورده شده است:

    <DecodeJWT name="JWT-Decode-HS256">
        <DisplayName>JWT Verify HS256</DisplayName>
        <Source>request.header.authorization</Source>
        <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    </DecodeJWT>
    

    در مثال بالا، سرایند درخواست «مجوز» باید حاوی JWT باشد.

  2. تعیین کنید که آیا متغیر شناسایی‌شده در «مرحله ۱» در جریانی که خط‌مشی «رمزگشایی JWT» در آن اجرا می‌شود تعریف و دردسترس است یا نه.

  3. اگر متغیر یکی از این موارد باشد:

    • خارج از محدوده (در جریان خاصی که خط‌مشی در آن اجرا می‌شود دردسترس نیست) یا
    • قابل‌حل نیست (تعریف نشده است)

    در این صورت، این دلیل خطا است.

    در درخواست API مثال زیر، کاربر JWT را در سرایند درخواست مجوز ارسال نمی‌کند.

    curl -v "http://<org>-<env>.apigee.net/v1/decodeJWT"
    

    ازآنجایی‌که سرایند درخواست مجوز ارسال نمی‌شود، خط‌مشی «رمزگشایی JWT» با این خطا ناموفق می‌شود:

    "faultstring": "Invalid token: policy({0})"
    

وضوح

مطمئن شوید متغیر ارجاع‌شده در عنصر <Source> خط‌مشی «رمزگشایی JWT» تعریف شده باشد، حاوی JWT معتبر (رمزگشایی‌شدنی) باشد، و در جاری‌سازی خاصی که خط‌مشی «رمزگشایی JWT» در آن اجرا می‌شود دردسترس باشد.

برای اصلاح مثال نشان‌داده‌شده در بالا، می‌توانید یک JWT معتبر را در سرایند مجوز درخواست ارسال کنید. این کار را می‌توان با انجام تماس API بااستفاده از دستور cURL به روش زیر انجام داد:

curl -v "http://<org>-<env>.apigee.net/v1/decodeJWT" -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"