Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

django-oauth-toolkit : Customize authenticate response

I am new to Django OAuth Toolkit. I want to customize the authenticate response.

My authenticate url configuration on django application is :

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

https://django-oauth-toolkit.readthedocs.io/en/latest/install.html

Now, when i launch this command :

curl -X POST -d 'grant_type=password&username=$username&password=$password'
 -u "$client_id:$client_secret" http://127.0.0.1:8000/authenticate/token/

I get this response :

{
   "access_token": "ATiM10L0LNaldJPk12drXCjbhoeDR8",
   "expires_in": 36000,
   "refresh_token": "II4UBhXhpVDEKWmsUQxDzkj3OMjW1p",
   "scope": "read groups write",
   "token_type": "Bearer"
}

And would like this response :

{
   "access_token": "ATiM10L0LNaldJPk12drXCjbhoeDR8",
   "expires_in": 36000,
   "refresh_token": "II4UBhXhpVDEKWmsUQxDzkj3OMjW1p",
   "scope": "read groups write",
   "token_type": "Bearer",
   "member": {
      "id": 1,
      "username": "username",
      "email": "[email protected]",
      ....
   }
}

I just want to override this response for add information of authenticated user. I have read the documentation of django-oauth-toolkit. And i didn't find a solution to my problem...

like image 467
Akila Avatar asked Nov 28 '22 13:11

Akila


1 Answers

I was able to make this change by overwriting the TokenView class in your views.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_authorized
import json


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

In urls.py, just overwrite the token url by pointing to the custom view. This import should come before the include of the django-oauth-toolkit

url(r"authenticate/token/$", CustomTokenView.as_view(), name="token"),
url('authenticate/',
    include('oauth2_provider.urls', namespace='oauth2_provider'))

The return will now contain the member data

  {
    "access_token": "YtiH9FGwAf7Cb814EjTKbv3FCpLtag", 
    "expires_in": 36000, 
    "token_type": "Bearer", 
    "scope": "read write groups", 
    "refresh_token": "99TyWmCwELrJvymT8m6Z9EPxGr3PJi", 
    "member": {
        "id": 1, 
        "username": "admin", 
        "email": "[email protected]"
     }
  }
like image 61
Thiago Abreu Rodrigues Avatar answered Dec 04 '22 10:12

Thiago Abreu Rodrigues