From a8e828e813db38eeb9e0cf588c3c0a744b87500c Mon Sep 17 00:00:00 2001 From: internetti Date: Wed, 18 May 2022 18:05:27 +0200 Subject: [PATCH 1/9] COR-475: map claims to specific keys --- cmd/devinit/main.go | 9 +- .../src/components/AuthenticatedApp.tsx | 2 +- .../IdentityProviderEditor.tsx | 104 ++++++++++++++++-- .../core-authnz-frontend/src/types/types.ts | 10 +- pkg/api/types/identity_provider.go | 13 ++- .../action_performing_auth_code_exchange.go | 4 +- pkg/server/login/store/identity_profile.go | 7 ++ pkg/store/identity_provider.go | 79 ++++++++++--- 8 files changed, 195 insertions(+), 33 deletions(-) create mode 100644 pkg/server/login/store/identity_profile.go diff --git a/cmd/devinit/main.go b/cmd/devinit/main.go index ec1d85bd2..bf33ad0f4 100644 --- a/cmd/devinit/main.go +++ b/cmd/devinit/main.go @@ -322,6 +322,7 @@ func createIdentityProviders(factory store.Factory, err error, orgId string, env if err != nil { return err } + idp := &types.IdentityProvider{ Name: "Fake OIDC", OrganizationID: orgId, @@ -330,7 +331,13 @@ func createIdentityProviders(factory store.Factory, err error, orgId string, env ClientSecret: envCfg.idpClientSecret, EmailDomain: "nrc.no", Scopes: "openid profile offline_access", - ClaimMappings: types.ClaimMappings{Mappings: nil, Version: "0"}, + ClaimMappings: types.ClaimMappings{Mappings: types.Mappings{ + Subject: "{{.Subject}}", + DisplayName: "{{.DisplayName}}", + FullName: "{{.FullName}}", + Email: "{{.Email}}", + EmailVerified: "{{.EmailVerified}}", + }, Version: "0"}, } if len(idps) == 0 { _, err := idpStore.Create(context.Background(), idp, store.IdentityProviderCreateOptions{}) diff --git a/frontend/apps/core-authnz-frontend/src/components/AuthenticatedApp.tsx b/frontend/apps/core-authnz-frontend/src/components/AuthenticatedApp.tsx index 38add189c..5fea3b32a 100644 --- a/frontend/apps/core-authnz-frontend/src/components/AuthenticatedApp.tsx +++ b/frontend/apps/core-authnz-frontend/src/components/AuthenticatedApp.tsx @@ -10,7 +10,7 @@ import { Clients } from './clients/Clients'; const AuthenticatedApp: FC = () => { return ( -
+
diff --git a/frontend/apps/core-authnz-frontend/src/components/organizations/identityproviders/IdentityProviderEditor.tsx b/frontend/apps/core-authnz-frontend/src/components/organizations/identityproviders/IdentityProviderEditor.tsx index 438c62c0a..b21a3899a 100644 --- a/frontend/apps/core-authnz-frontend/src/components/organizations/identityproviders/IdentityProviderEditor.tsx +++ b/frontend/apps/core-authnz-frontend/src/components/organizations/identityproviders/IdentityProviderEditor.tsx @@ -18,7 +18,16 @@ type FormData = { organizationId: string; emailDomain: string; scopes: string; - claimMappings: { Version: string; Mappings: any }; + claimMappings: { + version: string; + mappings: { + subject: string; + displayName: string; + fullName: string; + email: string; + emailVerified: string; + }; + }; }; export const IdentityProviderEditor: FC = (props) => { @@ -50,17 +59,32 @@ export const IdentityProviderEditor: FC = (props) => { setValue('clientSecret', ''); setValue('scopes', data.scopes); setValue( - 'claimMappings.Mappings', - JSON.stringify(data.claimMappings.Mappings), + 'claimMappings.mappings.subject', + JSON.stringify(data.claimMappings.mappings.subject), + ); + setValue( + 'claimMappings.mappings.displayName', + JSON.stringify(data.claimMappings.mappings.displayName), + ); + setValue( + 'claimMappings.mappings.fullName', + JSON.stringify(data.claimMappings.mappings.fullName), + ); + setValue( + 'claimMappings.mappings.email', + JSON.stringify(data.claimMappings.mappings.email), + ); + setValue( + 'claimMappings.mappings.emailVerified', + JSON.stringify(data.claimMappings.mappings.emailVerified), ); - setVersion(data.claimMappings.Version); + setVersion(data.claimMappings.version); }; useEffect(() => { if (id) { apiClient.getIdentityProvider({ id }).then((resp) => { if (resp.response) { - console.log('RESP', resp.response); setData(resp.response); } }); @@ -81,8 +105,16 @@ export const IdentityProviderEditor: FC = (props) => { emailDomain: args.emailDomain, scopes: args.scopes, claimMappings: { - Version: newVersion, - Mappings: JSON.parse(args.claimMappings.Mappings), + version: newVersion, + mappings: { + subject: JSON.parse(args.claimMappings.mappings.subject), + displayName: JSON.parse(args.claimMappings.mappings.displayName), + fullName: JSON.parse(args.claimMappings.mappings.fullName), + email: JSON.parse(args.claimMappings.mappings.email), + emailVerified: JSON.parse( + args.claimMappings.mappings.emailVerified, + ), + }, }, }; let resp; @@ -192,17 +224,67 @@ export const IdentityProviderEditor: FC = (props) => { {fieldErrors('scopes')}
+
+ Current Claim Mapping Version: {version} +
+
-