code: def dispatch(self, request):
          
          login_done_url = reverse(self.adapter.provider_id + "_callback")
          client = self._get_client(request, login_done_url)
          if not client.is_valid():
              if 'denied' in request.GET:
                  error = AuthError.CANCELLED
              else:
                  error = AuthError.UNKNOWN
              extra_context = dict(oauth_client=client)
              return render_authentication_error(
                  request,
                  self.adapter.provider_id,
                  error=error,
                  extra_context=extra_context)
          app = self.adapter.get_provider().get_app(request)
          try:
              access_token = client.get_access_token()
              token = SocialToken(
                  app=app,
                  token=access_token['oauth_token'],
                  # .get() -- e.g. Evernote does not feature a secret
                  token_secret=access_token.get('oauth_token_secret', ''))
              login = self.adapter.complete_login(request,
                                                  app,
                                                  token,
                                                  response=access_token)
              login.token = token
              login.state = SocialLogin.unstash_state(request)
              return complete_social_login(request, login)
          except OAuthError as e:
              return render_authentication_error(
                  request,
                  self.adapter.provider_id,
                  exception=e)
docs: View to handle final steps of OAuth based authentication where the user
          gets redirected back to from the service provider