Abstract getting by remote user ID.

pull/8765/head
Patrick Cloke 2020-10-21 16:24:16 -04:00
parent 5ad5b73e2a
commit 9f849b76c1
3 changed files with 43 additions and 19 deletions

View File

@ -864,20 +864,14 @@ class OidcHandler(BaseHandler):
# to be strings. # to be strings.
remote_user_id = str(remote_user_id) remote_user_id = str(remote_user_id)
logger.info( # first of all, check if we already have a mapping for this user
"Looking for existing mapping for user %s:%s", registered_user_id = await self._sso_handler.get_sso_user_by_remote_user_id(
self._auth_provider_id,
remote_user_id,
)
registered_user_id = await self.store.get_user_by_external_id(
self._auth_provider_id, remote_user_id, self._auth_provider_id, remote_user_id,
) )
if registered_user_id:
if registered_user_id is not None:
logger.info("Found existing mapping %s", registered_user_id)
return registered_user_id return registered_user_id
# Otherwise, generate a new user.
try: try:
attributes = await self._user_mapping_provider.map_user_attributes( attributes = await self._user_mapping_provider.map_user_attributes(
userinfo, token userinfo, token

View File

@ -250,16 +250,10 @@ class SamlHandler(BaseHandler):
with (await self._mapping_lock.queue(self._auth_provider_id)): with (await self._mapping_lock.queue(self._auth_provider_id)):
# first of all, check if we already have a mapping for this user # first of all, check if we already have a mapping for this user
logger.info( registered_user_id = await self._sso_handler.get_sso_user_by_remote_user_id(
"Looking for existing mapping for user %s:%s", self._auth_provider_id, remote_user_id,
self._auth_provider_id,
remote_user_id,
) )
registered_user_id = await self.store.get_user_by_external_id( if registered_user_id:
self._auth_provider_id, remote_user_id
)
if registered_user_id is not None:
logger.info("Found existing mapping %s", registered_user_id)
return registered_user_id return registered_user_id
# backwards-compatibility hack: see if there is an existing user with a # backwards-compatibility hack: see if there is an existing user with a

View File

@ -52,3 +52,39 @@ class SsoHandler(BaseHandler):
error=error, error_description=error_description error=error, error_description=error_description
) )
respond_with_html(request, 400, html) respond_with_html(request, 400, html)
async def get_sso_user_by_remote_user_id(
self, auth_provider_id: str, remote_user_id: str
) -> Optional[str]:
"""
Maps the user ID of a remote IdP to a mxid for a previously seen user.
If the user has not been seen yet, this will return None.
Args:
auth_provider_id: A unique identifier for this SSO provider, e.g.
"oidc" or "saml".
remote_user_id: The user ID according to the remote IdP. This might
be an e-mail address, a GUID, or some other form. It must be
unique and immutable.
Returns:
The mxid of a previously seen user.
"""
# Check if we already have a mapping for this user.
logger.info(
"Looking for existing mapping for user %s:%s",
auth_provider_id,
remote_user_id,
)
registered_user_id = await self.store.get_user_by_external_id(
auth_provider_id, remote_user_id,
)
# A match was found, return the user ID.
if registered_user_id is not None:
logger.info("Found existing mapping %s", registered_user_id)
return registered_user_id
# No match.
return None