from .oauth import BaseOAuth2 class CILogonOAuth2(BaseOAuth2): """ CI Logon Authentication Backend Docs: https://www.cilogon.org/oidc """ name = "cilogon-oauth2" AUTHORIZATION_URL = "https://cilogon.org/authorize" ACCESS_TOKEN_URL = "https://cilogon.org/oauth2/token" ACCESS_TOKEN_METHOD = "POST" DEFAULT_SCOPE = ["openid", "email", "profile", "org.cilogon.userinfo"] REDIRECT_STATE = False SCOPE_SEPARATOR = "+" def user_data(self, token, *args, **kwargs): """Loads user data from endpoint""" url = "https://cilogon.org/oauth2/userinfo" data = {"access_token": token} try: return self.get_json(url, method="POST", data=data) except ValueError: return None def get_user_id(self, details, response): """Return user unique id provided by service In this case it is a combination of the `sub` and `iss` respective values.""" return response.get("sub", "") + " " + response.get("iss", "") def get_user_details(self, response): """Return user details from CI Logon service""" fullname, first_name, last_name = self.get_user_names( first_name=response.get("given_name"), last_name=response.get("family_name") ) return { "username": response.get("email"), "email": response.get("email"), "fullname": fullname, "first_name": first_name, "last_name": last_name, }