Abstract getting by remote user ID.
parent
5ad5b73e2a
commit
9f849b76c1
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue