moderator/moderate/auth.py (23 lines of code) (raw):
from django.conf import settings
from mozilla_django_oidc.auth import OIDCAuthenticationBackend
class ModeratorAuthBackend(OIDCAuthenticationBackend):
"""Override base authentication class."""
def get_or_create_user(self, access_token, id_token, payload):
"""Get or create a new user only if they have one of the groups
mentioned in the ALLOWED_LOGIN_GROUPS in the claims.
"""
user_info = self.get_userinfo(access_token, id_token, payload)
groups = user_info.get("https://sso.mozilla.com/claim/groups", [])
# The user is not staff or NDA member. Return None
if not any(x in groups for x in settings.ALLOWED_LOGIN_GROUPS):
return None
return super(ModeratorAuthBackend, self).get_or_create_user(
access_token, id_token, payload
)
def update_user(self, user, claims):
# Update user status (nda, staff based on assertions)
profile = user.userprofile
if username := claims.get("uid"):
user.username = username
email = claims.get("email")
if email and user.email != email:
user.email = email
profile.avatar_url = claims.get("avatar", "")
user.save()
# Only staff members and members of the NDA group are allowed to login.
# Because of this everyone will get the is_nda_member set to True.
# If in the future more people are allowed to login this needs to be
# available to only members of the ALLOWED_LOGIN_GROUPS
profile.is_nda_member = True
profile.save()
return user