codekingpro/portable-devtools
114k
1from django.http import HttpResponseRedirect2from ..requests_client import OAuth1Session, OAuth2Session3from ..base_client import (4 BaseApp, OAuthError,5 OAuth1Mixin, OAuth2Mixin, OpenIDMixin,6)7 8 9class DjangoAppMixin:10 def save_authorize_data(self, request, **kwargs):11 state = kwargs.pop('state', None)12 if state:13 self.framework.set_state_data(request.session, state, kwargs)14 else:15 raise RuntimeError('Missing state value')16 17 def authorize_redirect(self, request, redirect_uri=None, **kwargs):18 """Create a HTTP Redirect for Authorization Endpoint.19 20 :param request: HTTP request instance from Django view.21 :param redirect_uri: Callback or redirect URI for authorization.22 :param kwargs: Extra parameters to include.23 :return: A HTTP redirect response.24 """25 rv = self.create_authorization_url(redirect_uri, **kwargs)26 self.save_authorize_data(request, redirect_uri=redirect_uri, **rv)27 return HttpResponseRedirect(rv['url'])28 29 30class DjangoOAuth1App(DjangoAppMixin, OAuth1Mixin, BaseApp):31 client_cls = OAuth1Session32 33 def authorize_access_token(self, request, **kwargs):34 """Fetch access token in one step.35 36 :param request: HTTP request instance from Django view.37 :return: A token dict.38 """39 params = request.GET.dict()40 state = params.get('oauth_token')41 if not state:42 raise OAuthError(description='Missing "oauth_token" parameter')43 44 data = self.framework.get_state_data(request.session, state)45 if not data:46 raise OAuthError(description='Missing "request_token" in temporary data')47 48 params['request_token'] = data['request_token']49 params.update(kwargs)50 self.framework.clear_state_data(request.session, state)51 return self.fetch_access_token(**params)52 53 54class DjangoOAuth2App(DjangoAppMixin, OAuth2Mixin, OpenIDMixin, BaseApp):55 client_cls = OAuth2Session56 57 def authorize_access_token(self, request, **kwargs):58 """Fetch access token in one step.59 60 :param request: HTTP request instance from Django view.61 :return: A token dict.62 """63 if request.method == 'GET':64 error = request.GET.get('error')65 if error:66 description = request.GET.get('error_description')67 raise OAuthError(error=error, description=description)68 params = {69 'code': request.GET.get('code'),70 'state': request.GET.get('state'),71 }72 else:73 params = {74 'code': request.POST.get('code'),75 'state': request.POST.get('state'),76 }77 78 claims_options = kwargs.pop('claims_options', None)79 state_data = self.framework.get_state_data(request.session, params.get('state'))80 self.framework.clear_state_data(request.session, params.get('state'))81 params = self._format_state_params(state_data, params)82 token = self.fetch_access_token(**params, **kwargs)83 84 if 'id_token' in token and 'nonce' in state_data:85 userinfo = self.parse_id_token(token, nonce=state_data['nonce'], claims_options=claims_options)86 token['userinfo'] = userinfo87 return token88 