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

时间:2017-01-31 11:25:06

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

我已成功为我的django rest api项目实现了oauth2。我想更改login api的错误响应格式。

当前的错误响应是

{
  "error_description": "Invalid credentials given.",
  "error": "invalid_grant"
}

我想将error_description键更改为detail(详细信息是所有其他django错误响应的关键)。我需要对所有错误响应进行标准化。

预期结果是

{
  "detail": "Invalid credentials given."
}

这是从/lib/python2.7/site-packages/oauthlib/oauth2/rfc6749/errors.py文件中的类OAuth2Error(Exception)执行的。

1 个答案:

答案 0 :(得分:2)

我建议拦截这种类型的响应,并根据需要进行调整。

有几种方法,但最简单的选择是定义自己的视图,该视图被调用授权URL,内部调用oauth2视图并修改此案例的响应,例如:

之类的东西

从:

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休息框架(DRF),我建议:

  • 设置custom DRF JSON renderer - 定义您自己的
  • 您的自定义渲染器应该继承默认渲染器(rest_framework.renderers.JSONRenderer)
  • 渲染器中的
  • 拦截所有响应 - 通过调用默认渲染函数并检测此特定的一个(error = invalid_grant)并自定义它

如果您不使用DRF:

  • 创建自定义中间件
  • 如果django< 1.10然后检查实施process_response,如果django> = 1.10然后call方法
  • 再次拦截所有响应并仅检测此响应,您可以根据需要进行修改