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)
|
@implementer(IGroupAwarePrincipal)
|
||||||
class Principal:
|
class Principal:
|
||||||
|
|
||||||
group_prefix = 'gloops.'
|
|
||||||
|
|
||||||
def __init__(self, id, data):
|
def __init__(self, id, data):
|
||||||
self.id = id
|
self.id = id
|
||||||
self.data = data
|
self.data = data
|
||||||
|
@ -72,8 +70,7 @@ class Principal:
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def groups(self):
|
def groups(self):
|
||||||
groups = [self.group_prefix + g for g in self.data.get('groups', [])]
|
return self.data.get('groups', [])
|
||||||
return groups
|
|
||||||
|
|
||||||
def asDict(self):
|
def asDict(self):
|
||||||
data = self.data.copy()
|
data = self.data.copy()
|
||||||
|
@ -85,6 +82,8 @@ class Authenticator(DummyFolder):
|
||||||
|
|
||||||
prefix = 'auth.oidc'
|
prefix = 'auth.oidc'
|
||||||
|
|
||||||
|
group_prefix = 'gloops.'
|
||||||
|
|
||||||
def __init__(self, request):
|
def __init__(self, request):
|
||||||
self.request = request
|
self.request = request
|
||||||
self.params = config.oidc_params
|
self.params = config.oidc_params
|
||||||
|
@ -98,7 +97,7 @@ class Authenticator(DummyFolder):
|
||||||
data = self.loadSession()
|
data = self.loadSession()
|
||||||
logger.debug('authenticate: %s', data)
|
logger.debug('authenticate: %s', data)
|
||||||
if data and 'userid' in 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 Principal(id, data)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@ -123,7 +122,7 @@ class Authenticator(DummyFolder):
|
||||||
logger.debug('login: URL %s', loginUrl)
|
logger.debug('login: URL %s', loginUrl)
|
||||||
self.request.response.redirect(loginUrl, trusted=True)
|
self.request.response.redirect(loginUrl, trusted=True)
|
||||||
|
|
||||||
def callback(self):
|
def callback(self, groupsProvider=None):
|
||||||
req = self.request
|
req = self.request
|
||||||
logger.debug('callback: %s %s', self, req.form)
|
logger.debug('callback: %s %s', self, req.form)
|
||||||
sdata = self.loadSession()
|
sdata = self.loadSession()
|
||||||
|
@ -142,12 +141,19 @@ class Authenticator(DummyFolder):
|
||||||
tokenResponse = requests.post(tokenUrl, data=args)
|
tokenResponse = requests.post(tokenUrl, data=args)
|
||||||
tdata = tokenResponse.json()
|
tdata = tokenResponse.json()
|
||||||
userData = self.getIdTokenData(tdata['id_token'])
|
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(
|
ndata = dict(
|
||||||
userid=userData['preferred_username'],
|
userid=userId,
|
||||||
name=userData['name'],
|
name=userData['name'],
|
||||||
email=userData['email'],
|
email=userData['email'],
|
||||||
groups=list(groupInfo.keys()),
|
groups=list(groups),
|
||||||
access_token=tdata['access_token'],
|
access_token=tdata['access_token'],
|
||||||
session_id=userData['sid'],
|
session_id=userData['sid'],
|
||||||
)
|
)
|
||||||
|
|
Loading…
Add table
Reference in a new issue