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.
Files changed (92) hide show
  1. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/CHANGES.md +8 -0
  2. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/Makefile +1 -0
  3. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/PKG-INFO +36 -2
  4. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/README.md +13 -0
  5. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/pyproject.toml +1 -1
  6. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/requirements.txt +1 -1
  7. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/setup.py +1 -1
  8. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/browser/configure.zcml +8 -0
  9. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/browser/view.py +32 -0
  10. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/PKG-INFO +36 -2
  11. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/SOURCES.txt +0 -3
  12. pas.plugins.oidc-2.0.0b3/src/pas/plugins/oidc/locales/de/LC_MESSAGES/pas.plugins.oidc.mo +0 -0
  13. pas.plugins.oidc-2.0.0b3/src/pas/plugins/oidc/locales/en/LC_MESSAGES/pas.plugins.oidc.mo +0 -0
  14. pas.plugins.oidc-2.0.0b3/src/pas/plugins/oidc/locales/es/LC_MESSAGES/pas.plugins.oidc.mo +0 -0
  15. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/.coveragerc +0 -0
  16. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/.pre-commit-config.yaml +0 -0
  17. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/CONTRIBUTORS.md +0 -0
  18. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/LICENSE.GPL +0 -0
  19. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/LICENSE.md +0 -0
  20. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/MANIFEST.in +0 -0
  21. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/constraints.txt +0 -0
  22. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/docs/icon.png +0 -0
  23. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/docs/screenshot-settings.png +0 -0
  24. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/instance.yaml +0 -0
  25. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/requirements-docs.txt +0 -0
  26. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/setup.cfg +0 -0
  27. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/__init__.py +0 -0
  28. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/__init__.py +0 -0
  29. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/__init__.py +0 -0
  30. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/browser/__init__.py +0 -0
  31. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/configure.zcml +0 -0
  32. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/__init__.py +0 -0
  33. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/classic.py +0 -0
  34. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/configure.zcml +0 -0
  35. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/deserializer.py +0 -0
  36. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/oidc.py +0 -0
  37. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/serializer.py +0 -0
  38. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/interfaces.py +0 -0
  39. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/locales/__init__.py +0 -0
  40. {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
  41. {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
  42. {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
  43. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/locales/pas.plugins.oidc.pot +0 -0
  44. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/locales/update.py +0 -0
  45. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/plugins.py +0 -0
  46. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/profiles/default/browserlayer.xml +0 -0
  47. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/profiles/default/controlpanel.xml +0 -0
  48. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/profiles/default/metadata.xml +0 -0
  49. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/profiles/uninstall/browserlayer.xml +0 -0
  50. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/__init__.py +0 -0
  51. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/configure.zcml +0 -0
  52. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/login/__init__.py +0 -0
  53. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/login/configure.zcml +0 -0
  54. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/login/get.py +0 -0
  55. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/oidc/__init__.py +0 -0
  56. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/oidc/configure.zcml +0 -0
  57. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/oidc/oidc.py +0 -0
  58. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/session.py +0 -0
  59. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/setuphandlers.py +0 -0
  60. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/testing.py +0 -0
  61. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/upgrades/__init__.py +0 -0
  62. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/upgrades/configure.zcml +0 -0
  63. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/utils.py +0 -0
  64. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/www/oidcPluginForm.zpt +0 -0
  65. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/dependency_links.txt +0 -0
  66. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/entry_points.txt +0 -0
  67. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/namespace_packages.txt +0 -0
  68. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/not-zip-safe +0 -0
  69. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/requires.txt +0 -0
  70. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/top_level.txt +0 -0
  71. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/conftest.py +0 -0
  72. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/controlpanel/conftest.py +0 -0
  73. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/controlpanel/test_controlpanel_api.py +0 -0
  74. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/docker-compose.yml +0 -0
  75. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/functional/conftest.py +0 -0
  76. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/functional/test_controlpanel_classic.py +0 -0
  77. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/functional/test_functional.py +0 -0
  78. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/keycloak/Dockerfile +0 -0
  79. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/keycloak/import/.gitkeep +0 -0
  80. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/keycloak/import/plone-realm.json +0 -0
  81. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/keycloak/import/plone-test-realm.json +0 -0
  82. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/plugin/test_plugin.py +0 -0
  83. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/services/conftest.py +0 -0
  84. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/services/test_services_login_get.py +0 -0
  85. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/services/test_services_oidc_get.py +0 -0
  86. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/services/test_services_oidc_post.py +0 -0
  87. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/services/test_servides_login_get_multiple_plugins.py +0 -0
  88. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/setup/test_setup_install.py +0 -0
  89. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/setup/test_setup_uninstall.py +0 -0
  90. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/utils/test_utils_flow.py +0 -0
  91. {pas.plugins.oidc-2.0.0b3 → pas_plugins_oidc-2.0.0b4}/tests/utils/test_utils_str.py +0 -0
  92. {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:
@@ -35,6 +35,7 @@ ifeq ($(PYTHON_VERSION_OK),0)
35
35
  endif
36
36
 
37
37
  all: build
38
+ build: install
38
39
 
39
40
  # Add the following 'help' target to your Makefile
40
41
  # And add help text after each target name starting with '\#\#'
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: pas.plugins.oidc
3
- Version: 2.0.0b3
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 ".[test]"
2
+ -e .[test]
@@ -14,7 +14,7 @@ long_description = f"""
14
14
 
15
15
  setup(
16
16
  name="pas.plugins.oidc",
17
- version="2.0.0b3",
17
+ version="2.0.0b4",
18
18
  description="OIDC support for Plone sites",
19
19
  long_description=long_description,
20
20
  long_description_content_type="text/markdown",
@@ -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()
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: pas.plugins.oidc
3
- Version: 2.0.0b3
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:
@@ -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