DecodeJWT 运行时错误问题排查

您正在查看 ApigeeApigee Hybrid 文档。
查看 Apigee Edge 文档。

FailedToDecode

错误代码

steps.jwt.FailedToDecode

错误响应正文

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

原因

如果“DecodeJWT 政策”的 <Source> 元素中指定的 JSON Web 令牌 (JWT) 格式不正确、无效或无法解码,则会出现此错误。

结构合理的 JWT 应包含以下格式的标头、载荷和签名:header.payload.signature。如果传递给 DecodeJWT 政策的 JWT 缺少组件部分,您会收到错误。例如,如果 JWT 只有 payload.signature,但缺少其 header,则会出现错误。

诊断

  1. 确定解码 JWT 政策的 <Source> 元素中指定的变量。此变量应包含 JWT。

    以下是 DecodeJWT 政策示例:

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

    在上例中,JWT 应包含在 Authorization 请求标头中。

  2. 检查第 1 步中识别的变量,并检查它包含的 JWT 是否有效。如果输入 JWT 无效,就会导致错误。

    在以下示例 API 请求中,输入 JWT 将传入 Authorization 请求标头中:

    curl -v "http://$EXTERNAL_IP/v1/decodeJWT" -H "Authorization: Bearer eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"
    

    其中,$EXTERNAL_IP 是外部负载均衡器的 IP 地址。此 IP 地址已向互联网公开。如需了解详情,请参阅自定义访问权限路由

    关闭 JWT 的检查表明其格式 payload.signature 无效。JWT 的预期格式为 header.payload.signature。因此,DecodeJWT 政策将失败并显示以下错误:

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

解决方法

确保传递给 DecodeJWT 政策的 JWT 包含全部三个元素、格式正确且可以解码。

如需更正上面显示的示例,您可以传递格式为 header.payload.signature 的有效 JWT。为此,您可以通过使用 cURL 命令进行 API 调用来实现,如下所示:

curl -v "http://$EXTERNAL_IP/v1/decodeJWT" -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"

其中,$EXTERNAL_IP 是外部负载均衡器的 IP 地址。此 IP 地址已向互联网公开。如需了解详情,请参阅自定义访问权限路由

InvalidToken

错误代码

steps.jwt.InvalidToken

错误响应正文

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

原因

如果 DecodeJWT 政策的 <Source> 元素中指定的流变量如下,则会出现此错误:

  • 超出范围(在执行政策的特定流中不可用)
  • 无法解析(未定义)

诊断

  1. 确定解码 JWT 政策的 <Source> 元素中指定的变量。此变量应包含 JWT。

    以下是 DecodeJWT 政策示例:

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

    在上面的示例中,Authorization 请求标头应包含 JWT。

  2. 确定第 1 步中识别的变量是否已定义,以及在执行 DecodeJWT 政策的流中是否可用。

  3. 如果该变量:

    • 超出范围(在执行政策的特定流中不可用)
    • 无法解析(未定义)

    就会导致错误。

    在以下 API 请求示例中,用户不会在 Authorization 请求标头中传递 JWT。

    curl -v "http://$EXTERNAL_IP/v1/decodeJWT"
    

其中,$EXTERNAL_IP 是外部负载均衡器的 IP 地址。此 IP 地址已向互联网公开。如需了解详情,请参阅自定义访问权限路由

Because the authorization request header is not passed, the Decode JWT policy fails with the error:

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

解决方法

确保在 DecodeJWT 政策的 <Source> 元素中引用的变量已定义、其中包含有效(可解码)JWT,并且在执行 DecodeJWT 政策的特定流中可用。

如需更正上面显示的示例,您可以在 Authorization 请求标头中传递有效的 JWT。为此,您可以通过使用 cURL 命令进行 API 调用来实现,如下所示:

curl -v "http://$EXTERNAL_IP/v1/decodeJWT" -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"

其中,$EXTERNAL_IP 是外部负载均衡器的 IP 地址。此 IP 地址已向互联网公开。如需了解详情,请参阅自定义访问权限路由