|
5 | 5 | import copy |
6 | 6 | import typing as t |
7 | 7 |
|
8 | | -from globus_sdk import AuthClient, AuthLoginClient, GlobusSDKUsageError, Scope |
| 8 | +from globus_sdk import ( |
| 9 | + AuthClient, |
| 10 | + AuthLoginClient, |
| 11 | + GlobusSDKUsageError, |
| 12 | + IDTokenDecoder, |
| 13 | + Scope, |
| 14 | +) |
9 | 15 | from globus_sdk._types import ScopeCollectionType, UUIDLike |
10 | 16 | from globus_sdk.authorizers import GlobusAuthorizer |
11 | 17 | from globus_sdk.gare import GlobusAuthorizationParameters |
@@ -97,6 +103,11 @@ def __init__( |
97 | 103 | scope_requirements=self._scope_requirements, |
98 | 104 | ) |
99 | 105 |
|
| 106 | + # setup an ID Token Decoder based on config; build one if it was not provided |
| 107 | + self._id_token_decoder = self._initialize_id_token_decoder( |
| 108 | + app_name=self.app_name, config=self.config, login_client=self._login_client |
| 109 | + ) |
| 110 | + |
100 | 111 | # initialize our authorizer factory |
101 | 112 | self._initialize_authorizer_factory() |
102 | 113 | self._authorizer_factory_initialized = True |
@@ -239,6 +250,34 @@ def _resolve_token_storage( |
239 | 250 | f"TokenStorage, TokenStorageProvider, or a supported string value." |
240 | 251 | ) |
241 | 252 |
|
| 253 | + def _initialize_id_token_decoder( |
| 254 | + self, *, app_name: str, config: GlobusAppConfig, login_client: AuthLoginClient |
| 255 | + ) -> IDTokenDecoder: |
| 256 | + """ |
| 257 | + Create an IDTokenDecoder or use the one provided via config, and set it on |
| 258 | + the token storage adapters. |
| 259 | +
|
| 260 | + It is only set on inner storage if the decoder was not already set, so a |
| 261 | + non-null value won't be overwritten. |
| 262 | +
|
| 263 | + This must run near the end of app initialization, when the `_token_storage` |
| 264 | + (inner) and `token_storage` (validating storage, outer) storages have both |
| 265 | + been initialized. |
| 266 | + """ |
| 267 | + if isinstance(self.config.id_token_decoder, IDTokenDecoder): |
| 268 | + id_token_decoder: IDTokenDecoder = self.config.id_token_decoder |
| 269 | + else: |
| 270 | + id_token_decoder = self.config.id_token_decoder.for_globus_app( |
| 271 | + app_name=app_name, |
| 272 | + config=config, |
| 273 | + login_client=login_client, |
| 274 | + ) |
| 275 | + if self._token_storage.id_token_decoder is None: |
| 276 | + self._token_storage.id_token_decoder = id_token_decoder |
| 277 | + self.token_storage.id_token_decoder = id_token_decoder |
| 278 | + |
| 279 | + return id_token_decoder |
| 280 | + |
242 | 281 | @abc.abstractmethod |
243 | 282 | def _initialize_authorizer_factory(self) -> None: |
244 | 283 | """ |
|
0 commit comments