我已经为我的 django Rest api 项目成功实现了 oauth2。我想更改登录api的错误响应格式。
当前错误响应是
{
"error_description": "Invalid credentials given.",
"error": "invalid_grant"
}
我想将 error_description 键更改为详细信息(详细信息是所有其他 django 错误响应的关键)。我需要对所有错误响应进行标准化。
预期结果是
{
"detail": "Invalid credentials given."
}
这是从/lib/python2.7/site-packages/oauthlib/oauth2/rfc6749/errors.py 文件中的类 OAuth2Error(Exception) 执行的。
最佳答案
我建议拦截这种类型的响应并根据您的意愿进行调整。
有多种方法,但最简单的选择是定义您自己的 View ,该 View 为授权 url 调用,该 View 在内部调用 oauth2 View 并修改这种情况的响应,例如类似的东西
来自:
from oauth2_provider.views import TokenView
...
url('auth/token/', TokenView.as_view()),
至:
from oauth2_provider.views import TokenView
def custom_token_view(request, *args, **kwargs):
response = TokenView.as_view()(request, *args, **kwargs)
if "invalid_grant " in response.content:
response = do_whatever_needed(response) # i.e. response.content
return response
...
url('auth/token/', custom_token_view),
更灵活/通用的解决方案替代方案
如果你使用 Django Rest Framework (DRF),我建议:
- 设置 custom DRF JSON renderer - 定义你自己的,
- 您的自定义渲染器应继承默认渲染器 (rest_framework.renderers.JSONRenderer)
- 在渲染器中拦截所有响应 - 通过调用默认渲染函数并检测此特定响应 (error=invalid_grant) 并对其进行自定义
如果您不使用 DRF:
- 创建自定义中间件
- 如果 django < 1.10,则检查实现 process_response ,如果 django >=1.10 则 call方法
- 再次拦截所有响应并仅检测此响应,您可以根据需要进行修改
关于Django Rest api 更改oauth响应错误格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41956359/