@@ -43,6 +43,12 @@ var jsonnetCache, _ = ristretto.NewCache(&ristretto.Config[[]byte, []byte]{
4343
4444type MetadataType string
4545
46+ type OIDCProviderData struct {
47+ Provider string `json:"provider"`
48+ Tokens * identity.CredentialsOIDCEncryptedTokens `json:"tokens"`
49+ Claims Claims `json:"claims"`
50+ }
51+
4652type VerifiedAddress struct {
4753 Value string `json:"value"`
4854 Via identity.VerifiableAddressType `json:"via"`
@@ -53,6 +59,8 @@ const (
5359
5460 PublicMetadata MetadataType = "identity.metadata_public"
5561 AdminMetadata MetadataType = "identity.metadata_admin"
62+
63+ InternalContextKeyProviderData = "provider_data"
5664)
5765
5866func (s * Strategy ) RegisterRegistrationRoutes (r * x.RouterPublic ) {
@@ -216,6 +224,27 @@ func (s *Strategy) Register(w http.ResponseWriter, r *http.Request, f *registrat
216224 return errors .WithStack (flow .ErrCompletedByStrategy )
217225 }
218226
227+ providerDataKey := flow .PrefixInternalContextKey (s .ID (), InternalContextKeyProviderData )
228+ if oidcProviderData := gjson .GetBytes (f .InternalContext , providerDataKey ); oidcProviderData .IsObject () {
229+ var providerData OIDCProviderData
230+ if err = json .Unmarshal ([]byte (oidcProviderData .Raw ), & providerData ); err != nil {
231+ return s .handleError (ctx , w , r , f , pid , nil , errors .WithStack (herodot .ErrInternalServerError .WithReasonf ("Expected OIDC provider data in internal context to be an object but got: %s" , err )))
232+ }
233+ if pid != providerData .Provider {
234+ return s .handleError (ctx , w , r , f , pid , nil , errors .WithStack (herodot .ErrInternalServerError .WithReasonf ("Expected OIDC provider data in internal context to have matching provider but got: %s" , providerData .Provider )))
235+ }
236+ container := & AuthCodeContainer {
237+ FlowID : f .ID .String (),
238+ Traits : p .Traits ,
239+ TransientPayload : f .TransientPayload ,
240+ }
241+ _ , err = s .processRegistration (ctx , w , r , f , providerData .Tokens , & providerData .Claims , provider , container )
242+ if err != nil {
243+ return s .handleError (ctx , w , r , f , pid , container .Traits , err )
244+ }
245+ return errors .WithStack (flow .ErrCompletedByStrategy )
246+ }
247+
219248 state , pkce , err := s .GenerateState (ctx , provider , f .ID )
220249 if err != nil {
221250 return s .handleError (ctx , w , r , f , pid , nil , err )
@@ -313,6 +342,13 @@ func (s *Strategy) processRegistration(ctx context.Context, w http.ResponseWrite
313342 return nil , nil
314343 }
315344
345+ providerDataKey := flow .PrefixInternalContextKey (s .ID (), InternalContextKeyProviderData )
346+ if hasOIDCProviderData := gjson .GetBytes (rf .InternalContext , providerDataKey ).IsObject (); ! hasOIDCProviderData {
347+ if internalContext , err := sjson .SetBytes (rf .InternalContext , providerDataKey , & OIDCProviderData {Provider : provider .Config ().ID , Tokens : token , Claims : * claims }); err == nil {
348+ rf .InternalContext = internalContext
349+ }
350+ }
351+
316352 fetch := fetcher .NewFetcher (fetcher .WithClient (s .d .HTTPClient (ctx )), fetcher .WithCache (jsonnetCache , 60 * time .Minute ))
317353 jsonnetMapperSnippet , err := fetch .FetchContext (ctx , provider .Config ().Mapper )
318354 if err != nil {
@@ -351,6 +387,10 @@ func (s *Strategy) processRegistration(ctx context.Context, w http.ResponseWrite
351387 return nil , s .handleError (ctx , w , r , rf , provider .Config ().ID , i .Traits , err )
352388 }
353389
390+ if internalContext , err := sjson .DeleteBytes (rf .InternalContext , providerDataKey ); err == nil {
391+ rf .InternalContext = internalContext
392+ }
393+
354394 return nil , nil
355395}
356396
0 commit comments