Skip to content

Commit af3885f

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 497aa9c commit af3885f

File tree

6 files changed

+42
-4
lines changed

6 files changed

+42
-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)
@@ -314,7 +316,7 @@ def _create_client(provider_metadata, client_metadata, verify_ssl=True):
314316
)
315317

316318
client.subject_type = (
317-
client.registration_response.get("subject_type")
318-
or client.provider_info["subject_types_supported"][0]
319+
client.registration_response.get("subject_type")
320+
or client.provider_info["subject_types_supported"][0]
319321
)
320322
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
del context.state[self.name]
103106
return self.auth_callback_func(context, internal_response)
104107

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
del context.state[self.name]
114117
return self.auth_callback_func(context, internal_response)
115118

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
del context.state[self.name]
149151
return self.auth_callback_func(context, internal_response)
150152

@@ -324,3 +326,22 @@ def get_metadata_desc_for_oauth_backend(entity_id, config):
324326

325327
metadata_description.append(description)
326328
return metadata_description
329+
330+
331+
def _get_metadata_to_decorate(config):
332+
metadata_dict = {}
333+
if "entity_info" in config:
334+
entity_info = config["entity_info"]
335+
if "ui_info" in entity_info:
336+
ui_info = entity_info["ui_info"]
337+
for name in ui_info.get("display_name", []):
338+
if name[1] == "en":
339+
metadata_dict["client_name"] = name[0]
340+
metadata_dict["client_name#" + name[1]] = name[0]
341+
for logo in ui_info.get("logo", []):
342+
if logo["lang"] == "en":
343+
metadata_dict["logo_uri"] = logo["image"]
344+
metadata_dict["logo_width"] = logo["width"]
345+
metadata_dict["logo_height"] = logo["height"]
346+
metadata_dict["logo_uri#" + logo["lang"]] = logo["image"]
347+
return metadata_dict

src/satosa/backends/openid_connect.py

+6
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
from satosa.internal import InternalData
1919
from .base import BackendModule
2020
from .oauth import get_metadata_desc_for_oauth_backend
21+
from .oauth import _get_metadata_to_decorate
22+
from ..context import Context
2123
from ..exception import SATOSAAuthenticationError, SATOSAError
2224
from ..response import Redirect
2325

@@ -208,6 +210,7 @@ def response_endpoint(self, context, *args):
208210
logger.error(logline)
209211
raise SATOSAAuthenticationError(context.state, "No user info available.")
210212

213+
context.decorate(Context.KEY_METADATA_STORE, _get_metadata_to_decorate(self.config))
211214
all_user_claims = dict(list(userinfo.items()) + list(id_token_claims.items()))
212215
msg = "UserInfo: {}".format(all_user_claims)
213216
logline = lu.LOG_FMT.format(id=lu.get_session_id(context.state), message=msg)
@@ -278,3 +281,6 @@ def _create_client(provider_metadata, client_metadata, verify_ssl=True):
278281
client.subject_type = (client.registration_response.get("subject_type") or
279282
client.provider_info["subject_types_supported"][0])
280283
return client
284+
285+
286+

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
del context.state[self.name]
8386
return self.auth_callback_func(context, internal_response)
8487

0 commit comments

Comments
 (0)