Skip to content

Commit 73d2201

Browse files
committed
feat: add metadata_store to context
Added a function that collects metadata for swamid-satosa metainfo plugin for non-SAML backends. The metadata is collected into dictionary and added to the context. The functionality added is similar to saml backend where the context is decorated with metadata of mdstore type.
1 parent 014e121 commit 73d2201

File tree

6 files changed

+40
-4
lines changed

6 files changed

+40
-4
lines changed

src/satosa/backends/apple.py

+6-4
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,20 @@
1919
from satosa.internal import InternalData
2020
from .base import BackendModule
2121
from .oauth import get_metadata_desc_for_oauth_backend
22+
from .oauth import _get_metadata_to_decorate
23+
from ..context import Context
2224
from ..exception import SATOSAAuthenticationError, SATOSAError
2325
from ..response import Redirect
2426

2527
import json
2628
import requests
2729

28-
2930
logger = logging.getLogger(__name__)
3031

3132
NONCE_KEY = "oidc_nonce"
3233
STATE_KEY = "oidc_state"
3334

35+
3436
# https://developer.okta.com/blog/2019/06/04/what-the-heck-is-sign-in-with-apple
3537
class AppleBackend(BackendModule):
3638
"""Sign in with Apple backend"""
@@ -240,8 +242,8 @@ def response_endpoint(self, context, *args):
240242
)
241243
logger.error(logline)
242244
raise SATOSAAuthenticationError(context.state, "No user info available.")
243-
244245
all_user_claims = dict(list(userinfo.items()) + list(id_token_claims.items()))
246+
context.decorate(Context.KEY_METADATA_STORE, _get_metadata_to_decorate(self.config))
245247
msg = "UserInfo: {}".format(all_user_claims)
246248
logline = lu.LOG_FMT.format(id=lu.get_session_id(context.state), message=msg)
247249
logger.debug(logline)
@@ -313,7 +315,7 @@ def _create_client(provider_metadata, client_metadata, verify_ssl=True):
313315
)
314316

315317
client.subject_type = (
316-
client.registration_response.get("subject_type")
317-
or client.provider_info["subject_types_supported"][0]
318+
client.registration_response.get("subject_type")
319+
or client.provider_info["subject_types_supported"][0]
318320
)
319321
return client

src/satosa/backends/github.py

+3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
from oic.oauth2.message import AuthorizationResponse
1111

1212
from satosa.backends.oauth import _OAuthBackend
13+
from .oauth import _get_metadata_to_decorate
14+
from satosa.context import Context
1315
from satosa.internal import AuthenticationInformation
1416
from satosa.internal import InternalData
1517
from satosa.response import Redirect
@@ -99,6 +101,7 @@ def _authn_response(self, context):
99101
internal_response.attributes = self.converter.to_internal(
100102
self.external_type, user_info)
101103
internal_response.subject_id = str(user_info[self.user_id_attr])
104+
context.decorate(Context.KEY_METADATA_STORE, _get_metadata_to_decorate(self.config))
102105
return self.auth_callback_func(context, internal_response)
103106

104107
def user_information(self, access_token):

src/satosa/backends/linkedin.py

+3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
from oic.oauth2.message import AuthorizationResponse
1111

1212
from satosa.backends.oauth import _OAuthBackend
13+
from .oauth import _get_metadata_to_decorate
14+
from satosa.context import Context
1315
from satosa.internal import AuthenticationInformation
1416
from satosa.internal import InternalData
1517
from satosa.response import Redirect
@@ -110,6 +112,7 @@ def _authn_response(self, context):
110112
self.external_type, user_info)
111113

112114
internal_response.subject_id = user_info[self.user_id_attr]
115+
context.decorate(Context.KEY_METADATA_STORE, _get_metadata_to_decorate(self.config))
113116
return self.auth_callback_func(context, internal_response)
114117

115118
def user_information(self, access_token, api):

src/satosa/backends/oauth.py

+21
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from oic.utils.authn.authn_context import UNSPECIFIED
1313

1414
import satosa.logging_util as lu
15+
from satosa.context import Context
1516
from satosa.internal import AuthenticationInformation
1617
from satosa.internal import InternalData
1718
from satosa.exception import SATOSAAuthenticationError
@@ -145,6 +146,7 @@ def _authn_response(self, context):
145146
internal_response = InternalData(auth_info=self.auth_info(context.request))
146147
internal_response.attributes = self.converter.to_internal(self.external_type, user_info)
147148
internal_response.subject_id = user_info[self.user_id_attr]
149+
context.decorate(Context.KEY_METADATA_STORE, _get_metadata_to_decorate(self.config))
148150
return self.auth_callback_func(context, internal_response)
149151

150152
def auth_info(self, request):
@@ -331,3 +333,22 @@ def get_metadata_desc_for_oauth_backend(entity_id, config):
331333

332334
metadata_description.append(description)
333335
return metadata_description
336+
337+
338+
def _get_metadata_to_decorate(config):
339+
metadata_dict = {}
340+
if "entity_info" in config:
341+
entity_info = config["entity_info"]
342+
if "ui_info" in entity_info:
343+
ui_info = entity_info["ui_info"]
344+
for name in ui_info.get("display_name", []):
345+
if name[1] == "en":
346+
metadata_dict["client_name"] = name[0]
347+
metadata_dict["client_name#" + name[1]] = name[0]
348+
for logo in ui_info.get("logo", []):
349+
if logo["lang"] == "en":
350+
metadata_dict["logo_uri"] = logo["image"]
351+
metadata_dict["logo_width"] = logo["width"]
352+
metadata_dict["logo_height"] = logo["height"]
353+
metadata_dict["logo_uri#" + logo["lang"]] = logo["image"]
354+
return metadata_dict

src/satosa/backends/openid_connect.py

+4
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
from ..exception import SATOSAAuthenticationError
2323
from ..exception import SATOSAError
2424
from ..exception import SATOSAMissingStateError
25+
from .oauth import _get_metadata_to_decorate
26+
from ..context import Context
27+
from ..exception import SATOSAAuthenticationError, SATOSAError
2528
from ..response import Redirect
2629

2730

@@ -242,6 +245,7 @@ def response_endpoint(self, context, *args):
242245
logger.error(logline)
243246
raise SATOSAAuthenticationError(context.state, "No user info available.")
244247

248+
context.decorate(Context.KEY_METADATA_STORE, _get_metadata_to_decorate(self.config))
245249
all_user_claims = dict(list(userinfo.items()) + list(id_token_claims.items()))
246250
msg = "UserInfo: {}".format(all_user_claims)
247251
logline = lu.LOG_FMT.format(id=lu.get_session_id(context.state), message=msg)

src/satosa/backends/orcid.py

+3
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99
from oic.utils.authn.authn_context import UNSPECIFIED
1010
from oic.oauth2.consumer import stateID
1111
from oic.oauth2.message import AuthorizationResponse
12+
from .oauth import _get_metadata_to_decorate
1213

1314
from satosa.backends.oauth import _OAuthBackend
15+
from satosa.context import Context
1416
from satosa.internal import InternalData
1517
from satosa.internal import AuthenticationInformation
1618
from satosa.util import rndstr
@@ -79,6 +81,7 @@ def _authn_response(self, context):
7981
internal_response.attributes = self.converter.to_internal(
8082
self.external_type, user_info)
8183
internal_response.subject_id = user_info[self.user_id_attr]
84+
context.decorate(Context.KEY_METADATA_STORE, _get_metadata_to_decorate(self.config))
8285
return self.auth_callback_func(context, internal_response)
8386

8487
def user_information(self, access_token, orcid, name=None):

0 commit comments

Comments
 (0)