From 0ff42e9f27e97da20ceb540b8d95546a86a31c20 Mon Sep 17 00:00:00 2001
From: Pablo Roncero Fernandez <pablo.roncero.fernandez@cern.ch>
Date: Mon, 4 May 2020 18:56:51 +0200
Subject: [PATCH] Add logout button

---
 .env                                           |  1 +
 .env.dev                                       |  1 +
 src/App.js                                     |  2 ++
 src/auth/actions/Logout.js                     | 13 +------------
 src/auth/pages/logoutPage/LogoutPage.js        | 18 ++++++++++++++++++
 src/auth/pages/redirectPage/RedirectPage.js    |  2 +-
 src/auth/reducers/index.js                     |  4 ++--
 src/auth/routes/index.js                       |  8 ++++++--
 .../components/CERNToolBar/CERNToolBar.js      |  7 +++----
 src/common/reducers/SnackbarReducer.js         |  1 -
 10 files changed, 35 insertions(+), 22 deletions(-)
 create mode 100644 src/auth/pages/logoutPage/LogoutPage.js

diff --git a/.env b/.env
index e075f4ca..afa6db66 100644
--- a/.env
+++ b/.env
@@ -2,4 +2,5 @@ REACT_APP_BASE_URL=https://localhost:8080/api
 REACT_APP_OAUTH_CLIENT_ID=push-notifications
 REACT_APP_AUTHORIZATION_URL=https://auth.cern.ch/auth/realms/cern/protocol/openid-connect/auth
 REACT_APP_OAUTH_REDIRECT_URL=https://localhost:3000/redirect
+REACT_APP_OAUTH_LOGOUT_URL=https://localhost:3000/logout
 REACT_APP_NODE_TLS_REJECT_UNAUTHORIZED=0
\ No newline at end of file
diff --git a/.env.dev b/.env.dev
index e47ddc12..ef9fdf72 100644
--- a/.env.dev
+++ b/.env.dev
@@ -2,3 +2,4 @@ REACT_APP_BASE_URL=https://test-notifications-service.web.cern.ch/api
 REACT_APP_OAUTH_CLIENT_ID=push-notifications
 REACT_APP_AUTHORIZATION_URL=https://auth.cern.ch/auth/realms/cern/protocol/openid-connect/auth
 REACT_APP_OAUTH_REDIRECT_URL=https://test-notifications-service.web.cern.ch/redirect
+REACT_APP_OAUTH_LOGOUT_URL=https://test-notifications-service.web.cern.ch/logout
\ No newline at end of file
diff --git a/src/App.js b/src/App.js
index 4057e105..f8081ce9 100644
--- a/src/App.js
+++ b/src/App.js
@@ -6,6 +6,7 @@ import LoginPageContainer from "auth/containers/pages/LoginPageContainer";
 import RedirectPageContainer from "auth/containers/pages/RedirectPageContainer";
 import * as authRoutes from "auth/routes";
 import MainPageContainer from "./common/containers/pages/MainPageContainer";
+import LogoutPage from "./auth/pages/logoutPage/LogoutPage";
 
 const NoMatch = ({ location }) => (
   <div>
@@ -30,6 +31,7 @@ class App extends Component {
           path={authRoutes.loginRoute.path}
           component={LoginPageContainer}
         />
+        <Route path={authRoutes.logoutRoute.path} component={LogoutPage} />
         <Redirect to="/main/channels" />
       </Switch>
     );
diff --git a/src/auth/actions/Logout.js b/src/auth/actions/Logout.js
index c9d4add1..d5b079fc 100644
--- a/src/auth/actions/Logout.js
+++ b/src/auth/actions/Logout.js
@@ -1,16 +1,5 @@
-import { RSAA } from "redux-api-middleware";
-import { withAuth } from "auth/utils/authUtils";
-
 export const LOGOUT = "LOGOUT_REQUEST";
-export const LOGOUT_SUCCESS = "LOGOUT_SUCCESS";
-export const LOGOUT_FAILURE = "LOGOUT_FAILURE";
 
 export const logout = () => ({
-  [RSAA]: {
-    endpoint: `https://authorization-service-api.web.cern.ch/api/v1.0/Identity/logout`,
-    method: "POST",
-    credentials: "include",
-    headers: withAuth({ "Content-Type": "application/json" }),
-    types: [LOGOUT, LOGOUT_SUCCESS, LOGOUT_FAILURE],
-  },
+  type: LOGOUT,
 });
diff --git a/src/auth/pages/logoutPage/LogoutPage.js b/src/auth/pages/logoutPage/LogoutPage.js
new file mode 100644
index 00000000..611af7a8
--- /dev/null
+++ b/src/auth/pages/logoutPage/LogoutPage.js
@@ -0,0 +1,18 @@
+import React from "react";
+import { Redirect } from "react-router-dom";
+import { bindActionCreators } from "redux";
+import { connect } from "react-redux";
+import * as logoutActionCreators from "../../actions/Logout";
+
+const LogoutPage = ({ logout }) => {
+  logout();
+  return <Redirect to="/main/channels" />;
+};
+
+const mapStateToProps = (state) => ({});
+
+const mapDispatchToProps = (dispatch) => ({
+  ...bindActionCreators(logoutActionCreators, dispatch),
+});
+
+export default connect(mapStateToProps, mapDispatchToProps)(LogoutPage);
diff --git a/src/auth/pages/redirectPage/RedirectPage.js b/src/auth/pages/redirectPage/RedirectPage.js
index 9d080c54..222a45be 100644
--- a/src/auth/pages/redirectPage/RedirectPage.js
+++ b/src/auth/pages/redirectPage/RedirectPage.js
@@ -15,7 +15,7 @@ class RedirectPage extends Component {
 
   render() {
     if (this.props.isAuthenticated) {
-      return <Redirect to={notificationsRoute.path} />;
+      return <Redirect to="/main/channels" />;
     }
     return <Redirect to={authRoutes.loginRoute.path} />;
   }
diff --git a/src/auth/reducers/index.js b/src/auth/reducers/index.js
index 6d361485..b554d198 100644
--- a/src/auth/reducers/index.js
+++ b/src/auth/reducers/index.js
@@ -5,7 +5,7 @@ import {
   REFRESH_TOKEN_SUCCESS,
   REFRESH_TOKEN_FAILURE,
 } from "auth/actions/RefreshToken";
-import { LOGOUT_SUCCESS } from "../actions/Logout";
+import { LOGOUT } from "../actions/Logout";
 
 const initialState = {
   loggedIn: isAuthenticated(),
@@ -61,7 +61,7 @@ export default (state = initialState, action) => {
           non_field_errors: action.payload.statusText,
         },
       };
-    case LOGOUT_SUCCESS:
+    case LOGOUT:
       sessionStorage.removeItem("accessToken");
       sessionStorage.removeItem("refreshToken");
       return {
diff --git a/src/auth/routes/index.js b/src/auth/routes/index.js
index 36e61b8e..8162db4f 100644
--- a/src/auth/routes/index.js
+++ b/src/auth/routes/index.js
@@ -1,7 +1,11 @@
 export const loginRoute = {
-  path: "/login"
+  path: "/login",
 };
 
 export const redirectRoute = {
-  path: "/redirect"
+  path: "/redirect",
+};
+
+export const logoutRoute = {
+  path: "/logout",
 };
diff --git a/src/common/components/CERNToolBar/CERNToolBar.js b/src/common/components/CERNToolBar/CERNToolBar.js
index eedcc57f..b093c3a6 100644
--- a/src/common/components/CERNToolBar/CERNToolBar.js
+++ b/src/common/components/CERNToolBar/CERNToolBar.js
@@ -66,14 +66,13 @@ const CERNToolBarAuthenticated = ({ logout }) => {
               {getDecodedToken().cern_upn} (CERN)
             </a>{" "}
           </span>
-          <button
+          <a
             className="cern-signout"
-            type="button"
-            onClick={() => logout()}
             title="Sign out of your account"
+            href={`https://auth.cern.ch/auth/realms/cern/protocol/openid-connect/logout?redirect_uri=${process.env.REACT_APP_OAUTH_LOGOUT_URL}`}
           >
             Sign out
-          </button>
+          </a>
         </li>
         <li>
           <a
diff --git a/src/common/reducers/SnackbarReducer.js b/src/common/reducers/SnackbarReducer.js
index 6c5a2782..c7aeb1ec 100644
--- a/src/common/reducers/SnackbarReducer.js
+++ b/src/common/reducers/SnackbarReducer.js
@@ -15,7 +15,6 @@ const processHideSnackbar = (snackbars, index) => {
 };
 
 export default (state = INITIAL_STATE, action) => {
-  console.log(action.type);
   switch (action.type) {
     case SHOW_SNACKBAR:
       return processShowSnackbar(state, action.message, action.variant);
-- 
GitLab