Generating single access token with Django OAuth2 Toolkit

前端 未结 3 967
天命终不由人
天命终不由人 2021-02-05 15:05

I\'m using the latest Django OAuth2 Toolkit (0.10.0) with Python 2.7, Django 1.8 and Django REST framework 3.3

While using the grant_type=password, I notice

3条回答
  •  夕颜
    夕颜 (楼主)
    2021-02-05 15:45

    If you like to remove all previous access tokens before issuing a new one, there is a simple solution for this problem: Make your own token view provider!

    The code bellow will probably help you to achieve that kind of functionality:

    from oauth2_provider.models import AccessToken, Application
    from braces.views import CsrfExemptMixin
    from oauth2_provider.views.mixins import OAuthLibMixin
    from oauth2_provider.settings import oauth2_settings
    
    class TokenView(APIView, CsrfExemptMixin, OAuthLibMixin):
        permission_classes = (permissions.AllowAny,)
    
        server_class = oauth2_settings.OAUTH2_SERVER_CLASS
        validator_class = oauth2_settings.OAUTH2_VALIDATOR_CLASS
        oauthlib_backend_class = oauth2_settings.OAUTH2_BACKEND_CLASS
    
        def post(self, request):
            username = request.POST.get('username')
            try:
                if username is None:
                    raise User.DoesNotExist
                AccessToken.objects.filter(user=User.objects.get(username=username), application=Application.objects.get(name="Website")).delete()
            except Exception as e:
                return Response(e.message,status=400)
    
            url, headers, body, status = self.create_token_response(request)
            return Response(body, status=status, headers=headers)
    

    The part you should notice is the Try-Except block. In there we finding the Access tokens and removing them. All before we creating a new one.

    You can look at how to create your own Provider using OAuthLib. Also, this might be useful as well: TokenView in django-oauth-toolkit. You can see there the original Apiview. As you said, you were using this package.

    As for the refresh_token, as previously mentioned in other answers here, you can't do what you are asking. When looking at the code of oauthlib password grunt type, you will see that in its initialization, refresh_token is set to True. Unless you change the Grunt type it self, it can't be done.

    But you can do the same thing we did above with the access tokens. Create the token and then delete the refresh token.

提交回复
热议问题