Django Rest api 更改oauth响应错误格式

标签 django django-rest-framework django-authentication django-oauth

我已经为我的 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/

相关文章:

python - Django + 毒素 : Apps aren't loaded yet

django - 如何在 Django Rest 框架中使用一对多模型

django - Django身份验证:增加最大用户名长度

Python + 使函数更通用

python - Celery 工作运行时 SECRET_KEY 设置不能为空

django - 没有名为 filterspecs 的模块

Django Rest框架更新Put不允许

angularjs - Django Web App + REST API 架构作为一个项目的最佳实践

django - 如何重命名标准 django 注册模板的名称

python - 在 Django 应用程序中,每个用户只允许一个事件 session