当 API 使用自检执行 HTTP 令牌身份验证时,如果自检服务器关闭或返回 500,它应该返回什么?



当API使用Introspection执行HTTP令牌身份验证时,如果Introspection服务器关闭或返回500,它应该返回什么?

我正在编写一个 API,并希望遵守 Http 标准。如果 API 无法验证令牌(由于自定义自检服务器关闭或返回 500(,API 应返回 401、422 还是 500?

此外,如果此令牌侦测端点不是 Oauth 端点,它是否应该返回相同的 Http 代码?

我做了一些研究,发现:

  1. https://tools.ietf.org/id/draft-ietf-oauth-v2-bearer-11.xml#authn-header 这说明:"如果受保护的资源请求包含访问令牌并且身份验证失败,则资源服务器应包含 error 属性,以便向客户端提供访问请求被拒绝的原因。参数值在第 3.1 节中描述。此外,资源服务器可能包含 error_description 属性,以便为开发人员提供人类可读的解释,而不是向最终用户显示。

  2. https://tools.ietf.org/id/draft-ietf-oauth-v2-bearer-11.xml#resource-error-codes

这说明:"提供的访问令牌已过期、已吊销、格式不正确或因其他原因无效。资源应使用 HTTP 401(未经授权(状态代码进行响应。

现在,以上内容使我认为,在使用Oauth Introspection时,在给定的情况下,401肯定是正确的方法,而不是500。原因是因为身份验证不成功=失败。这听起来正确吗?另外,对于非 Oauth 内省,这应该是一样的吗?

我查看了Microsoft的.net核心API自省包的代码。它显示他们在这种情况下返回 401。代码位于:https://github.com/aspnet-contrib/AspNet.Security.OAuth.Extensions/blob/dev/src/AspNet.Security.OAuth.Introspection/OAuthIntrospectionHandler.cs

相关部分是:

// Return a failed authentication result if the introspection
// request failed or if the "active" claim was false.
var payload = await GetIntrospectionPayloadAsync(token);
if (payload == null || !payload.Value<bool>(OAuthIntrospectionConstants.Claims.Active))
{
Context.Features.Set(new OAuthIntrospectionFeature
{
Error = new OAuthIntrospectionError
{
Error = OAuthIntrospectionConstants.Errors.InvalidToken,
ErrorDescription = "The access token is not valid."
}
});
return AuthenticateResult.Fail("Authentication failed because the authorization " +
"server rejected the access token.");
}

最后我遇到了这个: https://www.rfc-editor.org/rfc/rfc6750#section-2.1

其中说:"如果受保护的资源请求不包括身份验证 凭据或不包含启用访问的访问令牌 对于受保护的资源,资源服务器必须包含 HTTP "WWW-身份验证"响应标头字段;它可能包含在 对其他条件也有反应。

您绝对不希望出现 4xx 错误,因为它表明它可能可由客户端解决,或者至少是客户端错误。这显然是中断,因此您的错误代码至少应以 5 开头。

如果您正在访问外部服务,该服务已关闭或出现故障,并且该服务至关重要(例如:在回退方面您无法执行任何操作(,则最合适的状态代码可能是503 Service Unavailable

最新更新