عیب یابی خطای زمان اجرا JWT را رمزگشایی کنید

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

رمزگشایی ناموفق

کد خطا

steps.jwt.FailedToDecode

متن پاسخ خطا

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

علت

این خطا زمانی رخ می‌دهد که JSON Web Token (JWT) مشخص شده در عنصر <Source> از سیاست Decode JWT، ناقص، نامعتبر یا غیرقابل رمزگشایی باشد.

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

تشخیص

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

    در اینجا یک نمونه از سیاست Decode JWT آورده شده است:

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

    در مثال بالا، JWT باید در هدر درخواست مجوز (Authorization request header) قرار گیرد.

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

    در مثال درخواست API زیر، ورودی JWT در هدر درخواست مجوز (Authorization request header) ارسال می‌شود:

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

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

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

وضوح تصویر

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

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

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

توکن نامعتبر

کد خطا

steps.jwt.InvalidToken

متن پاسخ خطا

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

علت

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

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

تشخیص

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

    در اینجا یک نمونه از سیاست Decode JWT آورده شده است:

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

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

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

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

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

    پس علت خطا همین است.

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

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

    از آنجا که هدر درخواست مجوز ارسال نمی‌شود، سیاست Decode JWT با خطای زیر شکست می‌خورد:

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

وضوح تصویر

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

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

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