From 8b3c15267ec7b6d25301b1e63efc1b4761dd465a Mon Sep 17 00:00:00 2001 From: Scott Adams <74183390+sra405@users.noreply.github.com> Date: Tue, 24 Oct 2023 09:58:55 +0100 Subject: [PATCH 1/2] Oidc-redux Signout Flow (#715) Related to #714 Hits signoutRedirect with a `id_token` during logout to invalidate hydra session ### Note This requires `post_logout_redirect_uris` to be registered with hydra client before merge (currently manual but I have an influx branch to bring this into terraform) --- CHANGELOG.md | 1 + src/components/Login/LoginMenu.jsx | 5 ++++- src/components/Login/LogoutButton.jsx | 15 ++++++++++----- src/components/Login/LogoutButton.test.js | 19 ++++++++++--------- src/utils/userManager.js | 1 + 5 files changed, 26 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e5f4662aa..1f143a644 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### Fixed - Clipped icon in "Save your work" toast (#707) +- Hydra logout flow to delete session (#714) ## [0.19.2] - 2023-10-12 diff --git a/src/components/Login/LoginMenu.jsx b/src/components/Login/LoginMenu.jsx index 99f9cb014..4742593bf 100644 --- a/src/components/Login/LoginMenu.jsx +++ b/src/components/Login/LoginMenu.jsx @@ -27,7 +27,10 @@ const LoginMenu = () => { > {t("globalNav.accountMenu.projects")} - + ) : ( { - const { className } = props; +const LogoutButton = ({ className, user }) => { const { t } = useTranslation(); - const navigate = useNavigate(); const onLogoutButtonClick = async (event) => { event.preventDefault(); + userManager.signoutRedirect({ id_token_hint: user?.id_token }); await userManager.removeUser(); localStorage.clear(); - navigate("/"); }; return ( @@ -25,4 +23,11 @@ const LogoutButton = (props) => { ); }; +LogoutButton.propTypes = { + className: PropTypes.string, + user: PropTypes.shape({ + id_token: PropTypes.string.isRequired, + }).isRequired, +}; + export default LogoutButton; diff --git a/src/components/Login/LogoutButton.test.js b/src/components/Login/LogoutButton.test.js index 33a19bbff..a7f72681b 100644 --- a/src/components/Login/LogoutButton.test.js +++ b/src/components/Login/LogoutButton.test.js @@ -7,27 +7,25 @@ import userManager from "../../utils/userManager"; import LogoutButton from "./LogoutButton"; jest.mock("../../utils/userManager", () => ({ + signoutRedirect: jest.fn(), removeUser: jest.fn(), })); let logoutButton; +const user = { + id_token: "1234", +}; + beforeEach(() => { const middlewares = []; const mockStore = configureStore(middlewares); - const initialState = { - editor: { - project: {}, - }, - auth: { - user: {}, - }, - }; + const initialState = {}; const store = mockStore(initialState); render( - + , ); @@ -40,5 +38,8 @@ test("Log out button shown", () => { test("Clicking log out button signs the user out", () => { fireEvent.click(logoutButton); + expect(userManager.signoutRedirect).toBeCalledWith({ + id_token_hint: user.id_token, + }); expect(userManager.removeUser).toHaveBeenCalled(); }); diff --git a/src/utils/userManager.js b/src/utils/userManager.js index 5796c1617..a47ad42fe 100644 --- a/src/utils/userManager.js +++ b/src/utils/userManager.js @@ -8,6 +8,7 @@ const host = `${window.location.protocol}//${window.location.hostname}${ const userManagerConfig = { client_id: process.env.REACT_APP_AUTHENTICATION_CLIENT_ID, redirect_uri: `${host}/auth/callback`, + post_logout_redirect_uri: host, response_type: "code", scope: "openid email profile force-consent allow-u13-login", authority: process.env.REACT_APP_AUTHENTICATION_URL, From 42e70c27538023f45dee7275732ea16934011f4c Mon Sep 17 00:00:00 2001 From: Scott Adams <74183390+sra405@users.noreply.github.com> Date: Wed, 25 Oct 2023 09:04:45 +0100 Subject: [PATCH 2/2] Release v0.19.3 (#719) CHANGELOG and package.json changes for release --- CHANGELOG.md | 5 ++++- package.json | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f143a644..86c178b93 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## Unreleased +## [0.19.3] - 2023-10-25 + ### Added - `stepChanged` custom event for the web component (#709) @@ -548,7 +550,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Events in Web Component indicating whether Mission Zero criteria have been met (#113) -[unreleased]: https://github.com/RaspberryPiFoundation/editor-ui/compare/v0.19.2...HEAD +[unreleased]: https://github.com/RaspberryPiFoundation/editor-ui/compare/v0.19.3...HEAD +[0.19.3]: https://github.com/RaspberryPiFoundation/editor-ui/releases/tag/v0.19.3 [0.19.2]: https://github.com/RaspberryPiFoundation/editor-ui/releases/tag/v0.19.2 [0.19.1]: https://github.com/RaspberryPiFoundation/editor-ui/releases/tag/v0.19.1 [0.19.0]: https://github.com/RaspberryPiFoundation/editor-ui/releases/tag/v0.19.0 diff --git a/package.json b/package.json index 13f468c59..ce207be48 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@raspberrypifoundation/editor-ui", - "version": "0.19.2", + "version": "0.19.3", "private": true, "dependencies": { "@RaspberryPiFoundation/design-system-react": "^0.1.2",