您正在查看 Apigee 和 Apigee 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
,则会出现错误。
诊断
确定解码 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 请求标头中。
检查第 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>
元素中指定的流变量如下,则会出现此错误:
- 超出范围(在执行政策的特定流中不可用)
- 无法解析(未定义)
诊断
确定解码 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。
确定第 1 步中识别的变量是否已定义,以及在执行 DecodeJWT 政策的流中是否可用。
如果该变量:
- 超出范围(在执行政策的特定流中不可用)
- 无法解析(未定义)
就会导致错误。
在以下 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 地址已向互联网公开。如需了解详情,请参阅自定义访问权限路由。