我希望使用 Django REST 框架创建一个 API,该 API 将通过其自省端点使用单独的身份验证服务器进行身份验证。授权流程应如下所示。
- 客户端向我们的身份验证服务器上的令牌端点提供用户凭据或刷新令牌。
- 如果提供的凭据或刷新令牌有效,则身份验证服务器使用访问令牌和刷新令牌进行响应。
- 然后,客户端在请求资源时将访问令牌发送到 API。
- API 使用我们身份验证服务器上的自省端点验证提供的访问令牌。
- 身份验证服务器会做出响应,让 API 知道访问令牌是否有效。
- 如果访问令牌有效,API 会使用请求的资源响应客户端。
第 4 步是我要完成的部分,Django OAuth Toolkit 看起来正好为此提供了一个选项。在关于设置单独的资源服务器的部分中,它声明它允许应用程序通过使用自省端点来验证访问令牌。
因此,我按照 Django OAuth Toolkit 的设置,将其RESOURCE_SERVER_INTROSPECTION_URL
指向我们身份验证服务器上的自省端点。然后我从我们的身份验证服务器获取了一个访问令牌并将其作为授权标头提供给 API,但我得到了以下响应。
Content-Type: application/json
WWW-Authenticate: Bearer realm="api",error="invalid_token",error_description="The access token is invalid."
Vary: Accept
Allow: GET, HEAD, OPTIONS
Content-Length: 58
{
"detail": "Authentication credentials were not provided."
}
如果我不提供令牌,我会得到相同的响应正文,但没有WWW-Authenticate
标头。奇怪的是,自省端点永远不会收到 POST 请求,它应该发送该请求以验证访问令牌。
那么我是否误读了文档,或者我做错了什么?为什么这不像我预期的那样工作?