Skip to content
This repository was archived by the owner on Jun 12, 2021. It is now read-only.

Commit 956057e

Browse files
committed
Add claims per client in id token
1 parent f554b7d commit 956057e

File tree

2 files changed

+105
-4
lines changed

2 files changed

+105
-4
lines changed

src/oidcendpoint/id_token.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,6 @@ def sign_encrypt(
242242

243243
def make(self, req, sess_info, authn_req=None, user_claims=False, **kwargs):
244244
_context = self.endpoint_context
245-
_sdb = _context.sdb
246245

247246
if authn_req:
248247
_client_id = authn_req["client_id"]
@@ -251,11 +250,14 @@ def make(self, req, sess_info, authn_req=None, user_claims=False, **kwargs):
251250

252251
_cinfo = _context.cdb[_client_id]
253252

254-
default_idtoken_claims = dict(self.kwargs.get("default_claims", {}))
253+
idtoken_claims = dict(
254+
self.kwargs.get("default_claims", {}),
255+
**_cinfo.get("id_token_claims", {})
256+
)
255257
lifetime = self.kwargs.get("lifetime")
256258

257259
userinfo = userinfo_in_id_token_claims(
258-
_context, sess_info, default_idtoken_claims
260+
_context, sess_info, idtoken_claims
259261
)
260262

261263
if user_claims:

tests/test_03_id_token.py

Lines changed: 100 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ def full_path(local_file):
3030
return os.path.join(BASEDIR, local_file)
3131

3232

33-
USERINFO = UserInfo(json.loads(open(full_path("users.json")).read()))
33+
USERS = json.loads(open(full_path("users.json")).read())
34+
USERINFO = UserInfo(USERS)
3435

3536
AREQN = AuthorizationRequest(
3637
response_type="code",
@@ -70,6 +71,10 @@ def full_path(local_file):
7071
"kwargs": {"user": "diana"},
7172
}
7273
},
74+
"userinfo": {
75+
"class": "oidcendpoint.user_info.UserInfo",
76+
"kwargs": {"db": USERS},
77+
},
7378
"client_authn": verify_client,
7479
"template_dir": "template",
7580
"id_token": {"class": IDToken, "kwargs": {"foo": "bar"}},
@@ -252,3 +257,97 @@ def test_get_sign_algorithm_4(self):
252257
)
253258
# default signing alg
254259
assert algs == {"sign": True, "encrypt": False, "sign_alg": "RS512"}
260+
261+
def test_default_claims(self):
262+
session_info = {
263+
"authn_req": AREQN,
264+
"sub": "sub",
265+
"authn_event": {
266+
"authn_info": "loa2",
267+
"authn_time": time.time(),
268+
"uid": "diana"
269+
},
270+
}
271+
self.endpoint_context.idtoken.kwargs['default_claims'] = {
272+
"nickname": {"essential": True}
273+
}
274+
req = {"client_id": "client_1"}
275+
_token = self.endpoint_context.idtoken.make(req, session_info)
276+
assert _token
277+
client_keyjar = KeyJar()
278+
_jwks = self.endpoint_context.keyjar.export_jwks()
279+
client_keyjar.import_jwks(_jwks, self.endpoint_context.issuer)
280+
_jwt = JWT(key_jar=client_keyjar, iss="client_1")
281+
res = _jwt.unpack(_token)
282+
assert "nickname" in res
283+
284+
def test_no_default_claims(self):
285+
session_info = {
286+
"authn_req": AREQN,
287+
"sub": "sub",
288+
"authn_event": {
289+
"authn_info": "loa2",
290+
"authn_time": time.time(),
291+
"uid": "diana"
292+
},
293+
}
294+
req = {"client_id": "client_1"}
295+
_token = self.endpoint_context.idtoken.make(req, session_info)
296+
assert _token
297+
client_keyjar = KeyJar()
298+
_jwks = self.endpoint_context.keyjar.export_jwks()
299+
client_keyjar.import_jwks(_jwks, self.endpoint_context.issuer)
300+
_jwt = JWT(key_jar=client_keyjar, iss="client_1")
301+
res = _jwt.unpack(_token)
302+
assert "nickname" not in res
303+
304+
def test_client_claims(self):
305+
session_info = {
306+
"authn_req": AREQN,
307+
"sub": "sub",
308+
"authn_event": {
309+
"authn_info": "loa2",
310+
"authn_time": time.time(),
311+
"uid": "diana"
312+
},
313+
}
314+
self.endpoint_context.cdb["client_1"]['id_token_claims'] = {
315+
"address": None
316+
}
317+
req = {"client_id": "client_1"}
318+
_token = self.endpoint_context.idtoken.make(req, session_info)
319+
assert _token
320+
client_keyjar = KeyJar()
321+
_jwks = self.endpoint_context.keyjar.export_jwks()
322+
client_keyjar.import_jwks(_jwks, self.endpoint_context.issuer)
323+
_jwt = JWT(key_jar=client_keyjar, iss="client_1")
324+
res = _jwt.unpack(_token)
325+
assert "address" in res
326+
assert "nickname" not in res
327+
328+
def test_client_claims_with_default(self):
329+
session_info = {
330+
"authn_req": AREQN,
331+
"sub": "sub",
332+
"authn_event": {
333+
"authn_info": "loa2",
334+
"authn_time": time.time(),
335+
"uid": "diana"
336+
},
337+
}
338+
self.endpoint_context.cdb["client_1"]['id_token_claims'] = {
339+
"address": None
340+
}
341+
self.endpoint_context.idtoken.kwargs['default_claims'] = {
342+
"nickname": {"essential": True}
343+
}
344+
req = {"client_id": "client_1"}
345+
_token = self.endpoint_context.idtoken.make(req, session_info)
346+
assert _token
347+
client_keyjar = KeyJar()
348+
_jwks = self.endpoint_context.keyjar.export_jwks()
349+
client_keyjar.import_jwks(_jwks, self.endpoint_context.issuer)
350+
_jwt = JWT(key_jar=client_keyjar, iss="client_1")
351+
res = _jwt.unpack(_token)
352+
assert "address" in res
353+
assert "nickname" in res

0 commit comments

Comments
 (0)