OIDC auth: directly use sub from JWT if appropriate; optionally add groups from calling application
This commit is contained in:
parent
775603046a
commit
94365602ca
1 changed files with 15 additions and 9 deletions
|
@ -60,8 +60,6 @@ authentication = OidcAuthentication(None)
|
|||
@implementer(IGroupAwarePrincipal)
|
||||
class Principal:
|
||||
|
||||
group_prefix = 'gloops.'
|
||||
|
||||
def __init__(self, id, data):
|
||||
self.id = id
|
||||
self.data = data
|
||||
|
@ -72,8 +70,7 @@ class Principal:
|
|||
|
||||
@property
|
||||
def groups(self):
|
||||
groups = [self.group_prefix + g for g in self.data.get('groups', [])]
|
||||
return groups
|
||||
return self.data.get('groups', [])
|
||||
|
||||
def asDict(self):
|
||||
data = self.data.copy()
|
||||
|
@ -85,6 +82,8 @@ class Authenticator(DummyFolder):
|
|||
|
||||
prefix = 'auth.oidc'
|
||||
|
||||
group_prefix = 'gloops.'
|
||||
|
||||
def __init__(self, request):
|
||||
self.request = request
|
||||
self.params = config.oidc_params
|
||||
|
@ -98,7 +97,7 @@ class Authenticator(DummyFolder):
|
|||
data = self.loadSession()
|
||||
logger.debug('authenticate: %s', data)
|
||||
if data and 'userid' in data:
|
||||
id = self.params.get('principal_prefix', '') + data.pop('userid')
|
||||
id = data.pop('userid')
|
||||
return Principal(id, data)
|
||||
return None
|
||||
|
||||
|
@ -123,7 +122,7 @@ class Authenticator(DummyFolder):
|
|||
logger.debug('login: URL %s', loginUrl)
|
||||
self.request.response.redirect(loginUrl, trusted=True)
|
||||
|
||||
def callback(self):
|
||||
def callback(self, groupsProvider=None):
|
||||
req = self.request
|
||||
logger.debug('callback: %s %s', self, req.form)
|
||||
sdata = self.loadSession()
|
||||
|
@ -142,12 +141,19 @@ class Authenticator(DummyFolder):
|
|||
tokenResponse = requests.post(tokenUrl, data=args)
|
||||
tdata = tokenResponse.json()
|
||||
userData = self.getIdTokenData(tdata['id_token'])
|
||||
groupInfo = userData.get('urn:zitadel:iam:org:project:roles', {})
|
||||
userId = userData['sub']
|
||||
if not '.' in userId:
|
||||
userId = (self.params.get('principal_prefix', '') +
|
||||
userData['preferred_username'])
|
||||
groups = userData.get('urn:zitadel:iam:org:project:roles', {})
|
||||
groups = set(self.group_prefix + g for g in groups)
|
||||
if groupsProvider is not None:
|
||||
groups = groups.union(groupsProvider(userId))
|
||||
ndata = dict(
|
||||
userid=userData['preferred_username'],
|
||||
userid=userId,
|
||||
name=userData['name'],
|
||||
email=userData['email'],
|
||||
groups=list(groupInfo.keys()),
|
||||
groups=list(groups),
|
||||
access_token=tdata['access_token'],
|
||||
session_id=userData['sid'],
|
||||
)
|
||||
|
|
Loading…
Add table
Reference in a new issue