pas.plugins.oidc 2.0.0b3__tar.gz → 2.0.0b4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/CHANGES.md +8 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/Makefile +1 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/PKG-INFO +36 -2
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/README.md +13 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/pyproject.toml +1 -1
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/requirements.txt +1 -1
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/setup.py +1 -1
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/browser/configure.zcml +8 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/browser/view.py +32 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/PKG-INFO +36 -2
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/SOURCES.txt +0 -3
- pas.plugins.oidc-2.0.0b3/src/pas/plugins/oidc/locales/de/LC_MESSAGES/pas.plugins.oidc.mo +0 -0
- pas.plugins.oidc-2.0.0b3/src/pas/plugins/oidc/locales/en/LC_MESSAGES/pas.plugins.oidc.mo +0 -0
- pas.plugins.oidc-2.0.0b3/src/pas/plugins/oidc/locales/es/LC_MESSAGES/pas.plugins.oidc.mo +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/.coveragerc +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/.pre-commit-config.yaml +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/CONTRIBUTORS.md +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/LICENSE.GPL +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/LICENSE.md +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/MANIFEST.in +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/constraints.txt +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/docs/icon.png +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/docs/screenshot-settings.png +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/instance.yaml +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/requirements-docs.txt +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/setup.cfg +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/__init__.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/__init__.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/__init__.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/browser/__init__.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/configure.zcml +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/__init__.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/classic.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/configure.zcml +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/deserializer.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/oidc.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/serializer.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/interfaces.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/locales/__init__.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/locales/de/LC_MESSAGES/pas.plugins.oidc.po +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/locales/en/LC_MESSAGES/pas.plugins.oidc.po +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/locales/es/LC_MESSAGES/pas.plugins.oidc.po +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/locales/pas.plugins.oidc.pot +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/locales/update.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/plugins.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/profiles/default/browserlayer.xml +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/profiles/default/controlpanel.xml +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/profiles/default/metadata.xml +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/profiles/uninstall/browserlayer.xml +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/__init__.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/configure.zcml +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/login/__init__.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/login/configure.zcml +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/login/get.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/oidc/__init__.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/oidc/configure.zcml +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/oidc/oidc.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/session.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/setuphandlers.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/testing.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/upgrades/__init__.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/upgrades/configure.zcml +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/utils.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/www/oidcPluginForm.zpt +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/dependency_links.txt +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/entry_points.txt +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/namespace_packages.txt +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/not-zip-safe +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/requires.txt +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/top_level.txt +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/conftest.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/controlpanel/conftest.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/controlpanel/test_controlpanel_api.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/docker-compose.yml +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/functional/conftest.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/functional/test_controlpanel_classic.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/functional/test_functional.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/keycloak/Dockerfile +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/keycloak/import/.gitkeep +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/keycloak/import/plone-realm.json +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/keycloak/import/plone-test-realm.json +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/plugin/test_plugin.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/services/conftest.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/services/test_services_login_get.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/services/test_services_oidc_get.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/services/test_services_oidc_post.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/services/test_servides_login_get_multiple_plugins.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/setup/test_setup_install.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/setup/test_setup_uninstall.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/utils/test_utils_flow.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/utils/test_utils_str.py +0 -0
- {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/utils/test_utils_url.py +0 -0
|
@@ -9,12 +9,20 @@
|
|
|
9
9
|
|
|
10
10
|
<!-- towncrier release notes start -->
|
|
11
11
|
|
|
12
|
+
## 2.0.0b4 (2025-02-28)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### New features:
|
|
16
|
+
|
|
17
|
+
- Add backchannel logout implementation for classic ui session @mamico [#67](https://github.com/collective/pas.plugins.oidc/issues/67)
|
|
18
|
+
|
|
12
19
|
## 2.0.0b3 (2025-02-03)
|
|
13
20
|
|
|
14
21
|
|
|
15
22
|
### New features:
|
|
16
23
|
|
|
17
24
|
- Register the adapter as needed by the @login endpoint present in plone.restapi @erral [#47](https://github.com/collective/pas.plugins.oidc/issues/47)
|
|
25
|
+
- Changes to make compatible with OAM (Oracle Access Manager) @djay [#65](https://github.com/collective/pas.plugins.oidc/pull/64)
|
|
18
26
|
|
|
19
27
|
|
|
20
28
|
### Internal:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: pas.plugins.oidc
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.0b4
|
|
4
4
|
Summary: OIDC support for Plone sites
|
|
5
5
|
Home-page: https://github.com/collective/pas.plugins.oidc
|
|
6
6
|
Author: mamico
|
|
@@ -53,6 +53,19 @@ Requires-Dist: zest.releaser[recommended]; extra == "test"
|
|
|
53
53
|
Requires-Dist: zestreleaser.towncrier; extra == "test"
|
|
54
54
|
Requires-Dist: pytest-mock; extra == "test"
|
|
55
55
|
Requires-Dist: requests-mock; extra == "test"
|
|
56
|
+
Dynamic: author
|
|
57
|
+
Dynamic: author-email
|
|
58
|
+
Dynamic: classifier
|
|
59
|
+
Dynamic: description
|
|
60
|
+
Dynamic: description-content-type
|
|
61
|
+
Dynamic: home-page
|
|
62
|
+
Dynamic: keywords
|
|
63
|
+
Dynamic: license
|
|
64
|
+
Dynamic: project-url
|
|
65
|
+
Dynamic: provides-extra
|
|
66
|
+
Dynamic: requires-dist
|
|
67
|
+
Dynamic: requires-python
|
|
68
|
+
Dynamic: summary
|
|
56
69
|
|
|
57
70
|
|
|
58
71
|
<div align="center"><img alt="pas.plugins.oidc logo" src="https://raw.githubusercontent.com/collective/pas.plugins.oidc/main/docs/icon.png" width="70" /></div>
|
|
@@ -270,6 +283,19 @@ Currently, the Plone logout form is unchanged.
|
|
|
270
283
|
Instead, for testing go to the logout page of the plugin: http://localhost:8080/Plone/acl_users/oidc/logout,
|
|
271
284
|
this will take you to Keycloak to logout, and then return to the post-logout redirect URL.
|
|
272
285
|
|
|
286
|
+
#### Backchannel SLO (experimental)
|
|
287
|
+
|
|
288
|
+
OIDC Backchannel Logout is a server-to-server mechanism where the IdP notifies RPs via an HTTP POST request to terminate user sessions upon logout, ensuring secure and seamless Single Logout (SLO) without relying on the user's browser.
|
|
289
|
+
See the specification [OpenID Connect Back-Channel Logout 1.0](https://openid.net/specs/openid-connect-backchannel-1_0.html).
|
|
290
|
+
|
|
291
|
+
Current backchannel logout implementation, in this product, utilizes functionality introduced in plone.session >= 4.0.0 (Plone 6 and later) for server-side session invalidation (see plone.session PR [plone.session#26](https://github.com/plone/plone.session/pull/26)), and, at the moment, applies only to Plone Classic UI.
|
|
292
|
+
|
|
293
|
+
To enable this functionality:
|
|
294
|
+
|
|
295
|
+
1. Navigate to `.../acl_users/session/manage_secret` and enable the `Enable per-user keyring` option.
|
|
296
|
+
|
|
297
|
+
2. Configure the OpenID Provider (e.g., Keycloak) to use the backchannel logout endpoint with the url: `.../acl_users/oidc/backchannel-logout`
|
|
298
|
+
|
|
273
299
|
## Technical Decisions
|
|
274
300
|
|
|
275
301
|
### Usage of sessions in the login process
|
|
@@ -411,12 +437,20 @@ The project is licensed under the GPLv2.
|
|
|
411
437
|
|
|
412
438
|
<!-- towncrier release notes start -->
|
|
413
439
|
|
|
440
|
+
## 2.0.0b4 (2025-02-28)
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
### New features:
|
|
444
|
+
|
|
445
|
+
- Add backchannel logout implementation for classic ui session @mamico [#67](https://github.com/collective/pas.plugins.oidc/issues/67)
|
|
446
|
+
|
|
414
447
|
## 2.0.0b3 (2025-02-03)
|
|
415
448
|
|
|
416
449
|
|
|
417
450
|
### New features:
|
|
418
451
|
|
|
419
452
|
- Register the adapter as needed by the @login endpoint present in plone.restapi @erral [#47](https://github.com/collective/pas.plugins.oidc/issues/47)
|
|
453
|
+
- Changes to make compatible with OAM (Oracle Access Manager) @djay [#65](https://github.com/collective/pas.plugins.oidc/pull/64)
|
|
420
454
|
|
|
421
455
|
|
|
422
456
|
### Internal:
|
|
@@ -213,6 +213,19 @@ Currently, the Plone logout form is unchanged.
|
|
|
213
213
|
Instead, for testing go to the logout page of the plugin: http://localhost:8080/Plone/acl_users/oidc/logout,
|
|
214
214
|
this will take you to Keycloak to logout, and then return to the post-logout redirect URL.
|
|
215
215
|
|
|
216
|
+
#### Backchannel SLO (experimental)
|
|
217
|
+
|
|
218
|
+
OIDC Backchannel Logout is a server-to-server mechanism where the IdP notifies RPs via an HTTP POST request to terminate user sessions upon logout, ensuring secure and seamless Single Logout (SLO) without relying on the user's browser.
|
|
219
|
+
See the specification [OpenID Connect Back-Channel Logout 1.0](https://openid.net/specs/openid-connect-backchannel-1_0.html).
|
|
220
|
+
|
|
221
|
+
Current backchannel logout implementation, in this product, utilizes functionality introduced in plone.session >= 4.0.0 (Plone 6 and later) for server-side session invalidation (see plone.session PR [plone.session#26](https://github.com/plone/plone.session/pull/26)), and, at the moment, applies only to Plone Classic UI.
|
|
222
|
+
|
|
223
|
+
To enable this functionality:
|
|
224
|
+
|
|
225
|
+
1. Navigate to `.../acl_users/session/manage_secret` and enable the `Enable per-user keyring` option.
|
|
226
|
+
|
|
227
|
+
2. Configure the OpenID Provider (e.g., Keycloak) to use the backchannel logout endpoint with the url: `.../acl_users/oidc/backchannel-logout`
|
|
228
|
+
|
|
216
229
|
## Technical Decisions
|
|
217
230
|
|
|
218
231
|
### Usage of sessions in the login process
|
|
@@ -123,7 +123,7 @@ Zope = [
|
|
|
123
123
|
]
|
|
124
124
|
python-dateutil = ['dateutil']
|
|
125
125
|
ignore-packages = ['plone.restapi', 'plone.volto', 'zestreleaser.towncrier', 'zest.releaser', 'pytest', 'pytest-cov', 'pytest-plone', 'pytest-docker', 'pytest-vcr', 'pytest-mock', 'zope.pytestlayer', 'requests-mock', 'vcrpy']
|
|
126
|
-
Plone = ['Products.CMFPlone', 'Products.CMFCore', 'Products.GenericSetup', 'Products.PluggableAuthService', 'Products.PlonePAS']
|
|
126
|
+
Plone = ['Products.CMFPlone', 'Products.CMFCore', 'Products.GenericSetup', 'Products.PluggableAuthService', 'Products.PlonePAS', 'plone.keyring']
|
|
127
127
|
|
|
128
128
|
##
|
|
129
129
|
# Add extra configuration options in .meta.toml:
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
-c constraints.txt
|
|
2
|
-
-e
|
|
2
|
+
-e .[test]
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/browser/configure.zcml
RENAMED
|
@@ -37,4 +37,12 @@
|
|
|
37
37
|
layer="pas.plugins.oidc.interfaces.IPasPluginsOidcLayer"
|
|
38
38
|
/>
|
|
39
39
|
|
|
40
|
+
<browser:page
|
|
41
|
+
name="backchannel-logout"
|
|
42
|
+
for="pas.plugins.oidc.plugins.IOIDCPlugin"
|
|
43
|
+
class=".view.BackChannelLogoutView"
|
|
44
|
+
permission="zope2.View"
|
|
45
|
+
layer="pas.plugins.oidc.interfaces.IPasPluginsOidcLayer"
|
|
46
|
+
/>
|
|
47
|
+
|
|
40
48
|
</configure>
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from oic.oic.message import BackChannelLogoutRequest
|
|
1
2
|
from oic.oic.message import EndSessionRequest
|
|
2
3
|
from oic.oic.message import IdToken
|
|
3
4
|
from pas.plugins.oidc import _
|
|
@@ -6,9 +7,11 @@ from pas.plugins.oidc import utils
|
|
|
6
7
|
from pas.plugins.oidc.plugins import OAuth2ConnectionException
|
|
7
8
|
from pas.plugins.oidc.session import Session
|
|
8
9
|
from plone import api
|
|
10
|
+
from plone.keyring.interfaces import IKeyManager
|
|
9
11
|
from Products.Five.browser import BrowserView
|
|
10
12
|
from urllib.parse import quote
|
|
11
13
|
from zExceptions import Unauthorized
|
|
14
|
+
from zope.component import getUtility
|
|
12
15
|
|
|
13
16
|
|
|
14
17
|
class RequireLoginView(BrowserView):
|
|
@@ -143,3 +146,32 @@ class CallbackView(BrowserView):
|
|
|
143
146
|
self.request.response.redirect(return_url)
|
|
144
147
|
else:
|
|
145
148
|
raise Unauthorized()
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
class BackChannelLogoutView(BrowserView):
|
|
152
|
+
def __call__(self):
|
|
153
|
+
if not self.request.method == "POST" or not self.request.get("logout_token"):
|
|
154
|
+
raise Unauthorized()
|
|
155
|
+
logout_request = BackChannelLogoutRequest(
|
|
156
|
+
logout_token=self.request.get("logout_token")
|
|
157
|
+
)
|
|
158
|
+
client = self.context.get_oauth2_client()
|
|
159
|
+
if logout_request.verify(
|
|
160
|
+
aud=client.client_id, iss=client.issuer, keyjar=client.keyjar
|
|
161
|
+
):
|
|
162
|
+
userid = logout_request.to_dict()["logout_token"]["sub"]
|
|
163
|
+
session = api.portal.get_tool("acl_users").session
|
|
164
|
+
if session.per_user_keyring:
|
|
165
|
+
secret_key = session._getSecretKey(userid)
|
|
166
|
+
manager = getUtility(IKeyManager)
|
|
167
|
+
if manager[secret_key]:
|
|
168
|
+
manager.clear(ring=secret_key)
|
|
169
|
+
manager.rotate(ring=secret_key)
|
|
170
|
+
else:
|
|
171
|
+
logger.error(
|
|
172
|
+
"For the backchannel logout, the session PAS needs to be configured with 'per user keyring'."
|
|
173
|
+
)
|
|
174
|
+
return ""
|
|
175
|
+
else:
|
|
176
|
+
logger.error("invalid backchannel logout request")
|
|
177
|
+
raise Unauthorized()
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: pas.plugins.oidc
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.0b4
|
|
4
4
|
Summary: OIDC support for Plone sites
|
|
5
5
|
Home-page: https://github.com/collective/pas.plugins.oidc
|
|
6
6
|
Author: mamico
|
|
@@ -53,6 +53,19 @@ Requires-Dist: zest.releaser[recommended]; extra == "test"
|
|
|
53
53
|
Requires-Dist: zestreleaser.towncrier; extra == "test"
|
|
54
54
|
Requires-Dist: pytest-mock; extra == "test"
|
|
55
55
|
Requires-Dist: requests-mock; extra == "test"
|
|
56
|
+
Dynamic: author
|
|
57
|
+
Dynamic: author-email
|
|
58
|
+
Dynamic: classifier
|
|
59
|
+
Dynamic: description
|
|
60
|
+
Dynamic: description-content-type
|
|
61
|
+
Dynamic: home-page
|
|
62
|
+
Dynamic: keywords
|
|
63
|
+
Dynamic: license
|
|
64
|
+
Dynamic: project-url
|
|
65
|
+
Dynamic: provides-extra
|
|
66
|
+
Dynamic: requires-dist
|
|
67
|
+
Dynamic: requires-python
|
|
68
|
+
Dynamic: summary
|
|
56
69
|
|
|
57
70
|
|
|
58
71
|
<div align="center"><img alt="pas.plugins.oidc logo" src="https://raw.githubusercontent.com/collective/pas.plugins.oidc/main/docs/icon.png" width="70" /></div>
|
|
@@ -270,6 +283,19 @@ Currently, the Plone logout form is unchanged.
|
|
|
270
283
|
Instead, for testing go to the logout page of the plugin: http://localhost:8080/Plone/acl_users/oidc/logout,
|
|
271
284
|
this will take you to Keycloak to logout, and then return to the post-logout redirect URL.
|
|
272
285
|
|
|
286
|
+
#### Backchannel SLO (experimental)
|
|
287
|
+
|
|
288
|
+
OIDC Backchannel Logout is a server-to-server mechanism where the IdP notifies RPs via an HTTP POST request to terminate user sessions upon logout, ensuring secure and seamless Single Logout (SLO) without relying on the user's browser.
|
|
289
|
+
See the specification [OpenID Connect Back-Channel Logout 1.0](https://openid.net/specs/openid-connect-backchannel-1_0.html).
|
|
290
|
+
|
|
291
|
+
Current backchannel logout implementation, in this product, utilizes functionality introduced in plone.session >= 4.0.0 (Plone 6 and later) for server-side session invalidation (see plone.session PR [plone.session#26](https://github.com/plone/plone.session/pull/26)), and, at the moment, applies only to Plone Classic UI.
|
|
292
|
+
|
|
293
|
+
To enable this functionality:
|
|
294
|
+
|
|
295
|
+
1. Navigate to `.../acl_users/session/manage_secret` and enable the `Enable per-user keyring` option.
|
|
296
|
+
|
|
297
|
+
2. Configure the OpenID Provider (e.g., Keycloak) to use the backchannel logout endpoint with the url: `.../acl_users/oidc/backchannel-logout`
|
|
298
|
+
|
|
273
299
|
## Technical Decisions
|
|
274
300
|
|
|
275
301
|
### Usage of sessions in the login process
|
|
@@ -411,12 +437,20 @@ The project is licensed under the GPLv2.
|
|
|
411
437
|
|
|
412
438
|
<!-- towncrier release notes start -->
|
|
413
439
|
|
|
440
|
+
## 2.0.0b4 (2025-02-28)
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
### New features:
|
|
444
|
+
|
|
445
|
+
- Add backchannel logout implementation for classic ui session @mamico [#67](https://github.com/collective/pas.plugins.oidc/issues/67)
|
|
446
|
+
|
|
414
447
|
## 2.0.0b3 (2025-02-03)
|
|
415
448
|
|
|
416
449
|
|
|
417
450
|
### New features:
|
|
418
451
|
|
|
419
452
|
- Register the adapter as needed by the @login endpoint present in plone.restapi @erral [#47](https://github.com/collective/pas.plugins.oidc/issues/47)
|
|
453
|
+
- Changes to make compatible with OAM (Oracle Access Manager) @djay [#65](https://github.com/collective/pas.plugins.oidc/pull/64)
|
|
420
454
|
|
|
421
455
|
|
|
422
456
|
### Internal:
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/SOURCES.txt
RENAMED
|
@@ -45,11 +45,8 @@ src/pas/plugins/oidc/controlpanel/serializer.py
|
|
|
45
45
|
src/pas/plugins/oidc/locales/__init__.py
|
|
46
46
|
src/pas/plugins/oidc/locales/pas.plugins.oidc.pot
|
|
47
47
|
src/pas/plugins/oidc/locales/update.py
|
|
48
|
-
src/pas/plugins/oidc/locales/de/LC_MESSAGES/pas.plugins.oidc.mo
|
|
49
48
|
src/pas/plugins/oidc/locales/de/LC_MESSAGES/pas.plugins.oidc.po
|
|
50
|
-
src/pas/plugins/oidc/locales/en/LC_MESSAGES/pas.plugins.oidc.mo
|
|
51
49
|
src/pas/plugins/oidc/locales/en/LC_MESSAGES/pas.plugins.oidc.po
|
|
52
|
-
src/pas/plugins/oidc/locales/es/LC_MESSAGES/pas.plugins.oidc.mo
|
|
53
50
|
src/pas/plugins/oidc/locales/es/LC_MESSAGES/pas.plugins.oidc.po
|
|
54
51
|
src/pas/plugins/oidc/profiles/default/browserlayer.xml
|
|
55
52
|
src/pas/plugins/oidc/profiles/default/controlpanel.xml
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/browser/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/__init__.py
RENAMED
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/classic.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/oidc.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/locales/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/locales/update.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/__init__.py
RENAMED
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/configure.zcml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/login/get.py
RENAMED
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/oidc/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/oidc/oidc.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/upgrades/__init__.py
RENAMED
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/upgrades/configure.zcml
RENAMED
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/www/oidcPluginForm.zpt
RENAMED
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/not-zip-safe
RENAMED
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/requires.txt
RENAMED
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/controlpanel/test_controlpanel_api.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/functional/test_controlpanel_classic.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/keycloak/import/plone-realm.json
RENAMED
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/keycloak/import/plone-test-realm.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/services/test_services_login_get.py
RENAMED
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/services/test_services_oidc_get.py
RENAMED
|
File without changes
|
{pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/services/test_services_oidc_post.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|