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

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

FailedToDecode

کد خطا

steps.jwt.FailedToDecode

بدنه پاسخ به خطا

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

علت

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

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

تشخیص

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

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

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

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

  2. متغیر شناسایی شده در مرحله 1 را بررسی کنید و بررسی کنید که آیا 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 است. در نتیجه، خط مشی 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"

InvalidToken

کد خطا

steps.jwt.InvalidToken

بدنه پاسخ به خطا

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

علت

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

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

تشخیص

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

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

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

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

  2. تعیین کنید که آیا متغیر شناسایی شده در مرحله 1 در جریانی که در آن خط مشی 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"