From 256e192d7a33a1663d84688e9eb083450db92070 Mon Sep 17 00:00:00 2001 From: Vivek Ratnavel Subramanian Date: Sat, 28 May 2022 18:27:24 -0700 Subject: [PATCH] Fix #5204: Support AWS Cognito SSO for user authentication (#5205) --- .../ui/src/assets/img/icon-aws-cognito.png | Bin 0 -> 66518 bytes .../auth-provider/AuthProvider.tsx | 7 ++++-- .../resources/ui/src/enums/signin.enum.ts | 1 + .../ui/src/pages/login/index.test.tsx | 1 + .../resources/ui/src/pages/login/index.tsx | 6 +++++ .../resources/ui/src/router/AppRouter.tsx | 10 ++++++-- .../ui/src/utils/AuthProvider.util.ts | 23 +++++++++++++++--- .../main/resources/ui/src/utils/SvgUtils.tsx | 6 +++++ .../resources/ui/src/utils/UserDataUtils.ts | 7 ++++-- 9 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 openmetadata-ui/src/main/resources/ui/src/assets/img/icon-aws-cognito.png diff --git a/openmetadata-ui/src/main/resources/ui/src/assets/img/icon-aws-cognito.png b/openmetadata-ui/src/main/resources/ui/src/assets/img/icon-aws-cognito.png new file mode 100644 index 0000000000000000000000000000000000000000..65d1b7304cb6d5bf303491564b8b0e314cf37055 GIT binary patch literal 66518 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 { if (res.data) { const updatedUserData = getUserDataFromOidc(res.data, user); - if (!matchUserDetails(res.data, updatedUserData, ['profile'])) { + if ( + !matchUserDetails(res.data, updatedUserData, ['profile', 'email']) + ) { getUpdatedUser(updatedUserData, res.data); } else { appState.updateUserDetails(res.data); @@ -416,7 +418,8 @@ export const AuthProvider = ({ ); } case AuthTypes.GOOGLE: - case AuthTypes.CUSTOM_OIDC: { + case AuthTypes.CUSTOM_OIDC: + case AuthTypes.AWS_COGNITO: { return authConfig ? ( { ['auth0', 'Sign in with auth0'], ['azure', 'Sign in with azure'], ['custom-oidc', 'Sign in with sso'], + ['aws-cognito', 'Sign in with aws cognito'], ['unknown-provider', 'SSO Provider unknown-provider is not supported'], ])( 'Sign in button should render correctly for %s', diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/login/index.tsx b/openmetadata-ui/src/main/resources/ui/src/pages/login/index.tsx index ff4e6f6f27d..b03cbed085d 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/login/index.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/pages/login/index.tsx @@ -80,6 +80,12 @@ const SigninPage = () => { break; } + case AuthTypes.AWS_COGNITO: { + ssoBrandLogo = Icons.COGNITO_ICON; + ssoBrandName = 'AWS Cognito'; + + break; + } case AuthTypes.AZURE: { ssoBrandLogo = Icons.AZURE_ICON; ssoBrandName = 'Azure'; diff --git a/openmetadata-ui/src/main/resources/ui/src/router/AppRouter.tsx b/openmetadata-ui/src/main/resources/ui/src/router/AppRouter.tsx index f4917a44aaa..f271d6cedab 100644 --- a/openmetadata-ui/src/main/resources/ui/src/router/AppRouter.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/router/AppRouter.tsx @@ -32,13 +32,19 @@ const AppRouter = () => { getCallBackComponent, } = useAuthContext(); const callbackComponent = getCallBackComponent(); + const oidcProviders = [ + AuthTypes.GOOGLE, + AuthTypes.AWS_COGNITO, + AuthTypes.CUSTOM_OIDC, + ]; + const isOidcProvider = + authConfig?.provider && oidcProviders.includes(authConfig.provider); return loading ? ( ) : ( <> - {authConfig?.provider === AuthTypes.GOOGLE || - authConfig?.provider === AuthTypes.CUSTOM_OIDC ? ( + {isOidcProvider ? ( ) : ( <> diff --git a/openmetadata-ui/src/main/resources/ui/src/utils/AuthProvider.util.ts b/openmetadata-ui/src/main/resources/ui/src/utils/AuthProvider.util.ts index e3a12f2fef6..0e4faf06d7f 100644 --- a/openmetadata-ui/src/main/resources/ui/src/utils/AuthProvider.util.ts +++ b/openmetadata-ui/src/main/resources/ui/src/utils/AuthProvider.util.ts @@ -42,7 +42,7 @@ export const getRedirectUri = (callbackUrl: string) => { export const getUserManagerConfig = ( authClient: Record = {} ): Record => { - const { authority, clientId, callbackUrl } = authClient; + const { authority, clientId, callbackUrl, responseType, scope } = authClient; return { authority, @@ -50,10 +50,10 @@ export const getUserManagerConfig = ( // eslint-disable-next-line @typescript-eslint/camelcase client_id: clientId, // eslint-disable-next-line @typescript-eslint/camelcase - response_type: 'id_token', + response_type: responseType, // eslint-disable-next-line @typescript-eslint/camelcase redirect_uri: getRedirectUri(callbackUrl), - scope: 'openid email profile', + scope, userStore: new WebStorageStateStore({ store: localStorage }), }; }; @@ -87,6 +87,8 @@ export const getAuthConfig = ( callbackUrl: redirectUri, provider, providerName, + scope: 'openid email profile', + responseType: 'id_token', }; } @@ -98,6 +100,21 @@ export const getAuthConfig = ( clientId, callbackUrl: redirectUri, provider, + scope: 'openid email profile', + responseType: 'id_token', + }; + } + + break; + case AuthTypes.AWS_COGNITO: + { + config = { + authority, + clientId, + callbackUrl: redirectUri, + provider, + scope: 'openid email profile', + responseType: 'code', }; } diff --git a/openmetadata-ui/src/main/resources/ui/src/utils/SvgUtils.tsx b/openmetadata-ui/src/main/resources/ui/src/utils/SvgUtils.tsx index 6a60401e360..c710f82598f 100644 --- a/openmetadata-ui/src/main/resources/ui/src/utils/SvgUtils.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/utils/SvgUtils.tsx @@ -13,6 +13,7 @@ import React, { FunctionComponent } from 'react'; import IconAuth0 from '../assets/img/icon-auth0.png'; +import IconCognito from '../assets/img/icon-aws-cognito.png'; import IconAzure from '../assets/img/icon-azure.png'; import IconGithub from '../assets/img/icon-github.png'; import IconGoogle from '../assets/img/icon-google.png'; @@ -156,6 +157,7 @@ export const Icons = { AZURE_ICON: 'azure-icon', GOOGLE_ICON: 'google-icon', OKTA_ICON: 'okta-icon', + COGNITO_ICON: 'cognito-icon', GITHUB_ICON: 'github-icon', AUTH0_ICON: 'auth0-icon', EDIT: 'icon-edit', @@ -354,6 +356,10 @@ const SVGIcons: FunctionComponent = ({ case Icons.OKTA_ICON: IconComponent = IconOkta; + break; + case Icons.COGNITO_ICON: + IconComponent = IconCognito; + break; case Icons.GITHUB_ICON: IconComponent = IconGithub; diff --git a/openmetadata-ui/src/main/resources/ui/src/utils/UserDataUtils.ts b/openmetadata-ui/src/main/resources/ui/src/utils/UserDataUtils.ts index 4d5f8bae671..d112e302e8c 100644 --- a/openmetadata-ui/src/main/resources/ui/src/utils/UserDataUtils.ts +++ b/openmetadata-ui/src/main/resources/ui/src/utils/UserDataUtils.ts @@ -12,7 +12,7 @@ */ import { AxiosError, AxiosResponse } from 'axios'; -import { isEmpty, isEqual, isUndefined } from 'lodash'; +import { isEqual, isUndefined } from 'lodash'; import { SearchedUsersAndTeams, SearchResponse } from 'Models'; import AppState from '../AppState'; import { OidcUser } from '../authentication/auth-provider/AuthProvider.interface'; @@ -64,11 +64,14 @@ export const getUserDataFromOidc = ( const images = oidcUser.profile.picture ? getImages(oidcUser.profile.picture) : undefined; + const profileEmail = oidcUser.profile.email; + const email = profileEmail ? profileEmail : userData.email; return { ...userData, + email, displayName: oidcUser.profile.name, - profile: !isEmpty(images) ? { images } : userData.profile, + profile: images ? { images } : userData.profile, }; };