Python django oauth工具包:自定义身份验证响应

Python django oauth工具包:自定义身份验证响应,python,django,python-3.x,django-rest-framework,django-oauth,Python,Django,Python 3.x,Django Rest Framework,Django Oauth,我是Django OAuth工具包的新手。我想自定义身份验证响应 django应用程序上的身份验证url配置为: url('authenticate/', include('oauth2_provider.urls', namespace='oauth2_provider')) 现在,当我启动此命令时: curl -X POST -d 'grant_type=password&username=$username&password=$password' -u "$c

我是Django OAuth工具包的新手。我想自定义身份验证响应

django应用程序上的身份验证url配置为:

url('authenticate/',
    include('oauth2_provider.urls', namespace='oauth2_provider'))

现在,当我启动此命令时:

curl -X POST -d 'grant_type=password&username=$username&password=$password'
 -u "$client_id:$client_secret" http://127.0.0.1:8000/authenticate/token/
我得到的答复是:

{
   "access_token": "ATiM10L0LNaldJPk12drXCjbhoeDR8",
   "expires_in": 36000,
   "refresh_token": "II4UBhXhpVDEKWmsUQxDzkj3OMjW1p",
   "scope": "read groups write",
   "token_type": "Bearer"
}
{
   "access_token": "ATiM10L0LNaldJPk12drXCjbhoeDR8",
   "expires_in": 36000,
   "refresh_token": "II4UBhXhpVDEKWmsUQxDzkj3OMjW1p",
   "scope": "read groups write",
   "token_type": "Bearer",
   "member": {
      "id": 1,
      "username": "username",
      "email": "email@gmail.com",
      ....
   }
}
并希望得到以下答复:

{
   "access_token": "ATiM10L0LNaldJPk12drXCjbhoeDR8",
   "expires_in": 36000,
   "refresh_token": "II4UBhXhpVDEKWmsUQxDzkj3OMjW1p",
   "scope": "read groups write",
   "token_type": "Bearer"
}
{
   "access_token": "ATiM10L0LNaldJPk12drXCjbhoeDR8",
   "expires_in": 36000,
   "refresh_token": "II4UBhXhpVDEKWmsUQxDzkj3OMjW1p",
   "scope": "read groups write",
   "token_type": "Bearer",
   "member": {
      "id": 1,
      "username": "username",
      "email": "email@gmail.com",
      ....
   }
}
我只想覆盖此响应以添加经过身份验证的用户的信息。
我已经阅读了django oauth工具包的文档。我没有找到解决问题的方法…

我可以通过覆盖TokenView类来进行更改 在您的视图中。py

from django.http import HttpResponse
from oauth2_provider.views.base import TokenView
from django.utils.decorators import method_decorator
from django.views.decorators.debug import sensitive_post_parameters
from oauth2_provider.models import get_access_token_model, get_application_model
from oauth2_provider.signals import app_authorize

class CustomTokenView(TokenView):
    @method_decorator(sensitive_post_parameters("password"))
    def post(self, request, *args, **kwargs):
        url, headers, body, status = self.create_token_response(request)
        if status == 200:
            body = json.loads(body)
            access_token = body.get("access_token")
            if access_token is not None:
                token = get_access_token_model().objects.get(
                    token=access_token)
                app_authorized.send(
                    sender=self, request=request,
                    token=token)
                body['member'] = {
                    'id': token.user.id, 
                    'username': token.user.username, 
                    'email': token.user.email
                }
                body = json.dumps(body) 
        response = HttpResponse(content=body, status=status)
        for k, v in headers.items():
            response[k] = v
        return response
import json
from rest_framework.response import Response
from drf_social_oauth2.views import TokenView
from oauth2_provider.models import get_access_token_model, get_application_model
from oauth2_provider.signals import app_authorized


class CustomTokenView(TokenView):
    def post(self, request, *args, **kwargs):
         mutable_data = request.data.copy()
          request._request.POST = request._request.POST.copy()
           for key, value in mutable_data.items():
                request._request.POST[key] = value
            url, headers, body, status = self.create_token_response(
                request._request)
            if status == 200:
                body = json.loads(body)
                access_token = body.get("access_token")
                if access_token is not None:
                    token = get_access_token_model().objects.get(
                        token=access_token)
                    app_authorized.send(
                        sender=self, request=request,
                        token=token)
                    body['member'] = {
                        'id': token.user.id,
                        'username': token.user.username,
                        'email': token.user.email
                    }
                    body = json.dumps(body)
            response = Response(data=json.loads(body), status=status)

            for k, v in headers.items():
                response[k] = v
            return response

     
url.py中,只需通过指向自定义视图覆盖令牌url即可。这个导入应该在django oauth工具包包含之前进行

url(r"authenticate/token/$", CustomTokenView.as_view(), name="token"),
url('authenticate/',
    include('oauth2_provider.urls', namespace='oauth2_provider'))
返回现在将包含成员数据

  {
    "access_token": "YtiH9FGwAf7Cb814EjTKbv3FCpLtag", 
    "expires_in": 36000, 
    "token_type": "Bearer", 
    "scope": "read write groups", 
    "refresh_token": "99TyWmCwELrJvymT8m6Z9EPxGr3PJi", 
    "member": {
        "id": 1, 
        "username": "admin", 
        "email": "admin@admin.com"
     }
  }

不确定有多少人使用drf_social_oauth2,但你也可以这样做。下面是我的解决方案覆盖

视图.py

from django.http import HttpResponse
from oauth2_provider.views.base import TokenView
from django.utils.decorators import method_decorator
from django.views.decorators.debug import sensitive_post_parameters
from oauth2_provider.models import get_access_token_model, get_application_model
from oauth2_provider.signals import app_authorize

class CustomTokenView(TokenView):
    @method_decorator(sensitive_post_parameters("password"))
    def post(self, request, *args, **kwargs):
        url, headers, body, status = self.create_token_response(request)
        if status == 200:
            body = json.loads(body)
            access_token = body.get("access_token")
            if access_token is not None:
                token = get_access_token_model().objects.get(
                    token=access_token)
                app_authorized.send(
                    sender=self, request=request,
                    token=token)
                body['member'] = {
                    'id': token.user.id, 
                    'username': token.user.username, 
                    'email': token.user.email
                }
                body = json.dumps(body) 
        response = HttpResponse(content=body, status=status)
        for k, v in headers.items():
            response[k] = v
        return response
import json
from rest_framework.response import Response
from drf_social_oauth2.views import TokenView
from oauth2_provider.models import get_access_token_model, get_application_model
from oauth2_provider.signals import app_authorized


class CustomTokenView(TokenView):
    def post(self, request, *args, **kwargs):
         mutable_data = request.data.copy()
          request._request.POST = request._request.POST.copy()
           for key, value in mutable_data.items():
                request._request.POST[key] = value
            url, headers, body, status = self.create_token_response(
                request._request)
            if status == 200:
                body = json.loads(body)
                access_token = body.get("access_token")
                if access_token is not None:
                    token = get_access_token_model().objects.get(
                        token=access_token)
                    app_authorized.send(
                        sender=self, request=request,
                        token=token)
                    body['member'] = {
                        'id': token.user.id,
                        'username': token.user.username,
                        'email': token.user.email
                    }
                    body = json.dumps(body)
            response = Response(data=json.loads(body), status=status)

            for k, v in headers.items():
                response[k] = v
            return response

     

这太棒了<代码>来自oauth2\u提供商。信号导入应用程序\u授权文档:由于此处的顶部答案,解决了此问题