from django.views.generic import View from django.http import HttpResponseBadRequest, HttpResponseRedirect from django.conf import settings from .auth_core import SSOAuthCore from .exceptions import AuthError from pingcap_sso.utils.mixins import LoginRequiredMixin class SSOProviderEndpoint(LoginRequiredMixin, View): sso_core = SSOAuthCore() sso_secret = settings.DISCOURSE_SSO_TOKEN sso_callback_uri = settings.DISCOURSE_SSO_CALLBACK_URI def get(self, request, *args, **kwargs): sso = request.GET.get('sso') sig = request.GET.get('sig') try: nonce = self.sso_core.validate_authentication_request(sso, sig, self.sso_secret) except AuthError as e: return self.error_response(e.description) user = request.user # Discoure requires a validated email, so we will fake a email if user has not provided. # A fake email will like: 1057e02e-0c23-11ea-9fbb-f2189839837a@fake.email response_url = self.sso_core.create_response_payload( nonce, user.email or user.fake_email, False, user.openid, user.username, user.name, self.sso_secret) return HttpResponseRedirect( '{}?{}'.format(self.sso_callback_uri, response_url)) def error_response(self, error): return HttpResponseBadRequest( 'sso client error: {} , please try again or contact support@pincap.com'.format(error))