2

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

当前的错误响应是

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

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

预期结果是

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

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

4

1 回答 1

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),我建议:

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

如果您不使用 DRF:

  • 创建自定义中间件
  • 如果 django < 1.10 然后检查实现process_response,如果 django >=1.10 然后调用方法
  • 再次,拦截所有响应并仅检测此响应,您可以根据需要对其进行修改
于 2017-09-22T13:59:33.833 回答