@@ -78,6 +78,8 @@ type ApiSession interface {
7878
7979 //RequiresRouterTokenUpdate returns true if the token is a bearer token requires updating on edge router connections.
8080 RequiresRouterTokenUpdate () bool
81+
82+ GetRequestHeaders () http.Header
8183}
8284
8385var _ ApiSession = (* ApiSessionLegacy )(nil )
@@ -86,7 +88,12 @@ var _ ApiSession = (*ApiSessionOidc)(nil)
8688// ApiSessionLegacy represents OpenZiti's original authentication API Session Detail, supplied in the `zt-session` header.
8789// It has been supplanted by OIDC authentication represented by ApiSessionOidc.
8890type ApiSessionLegacy struct {
89- Detail * rest_model.CurrentAPISessionDetail
91+ Detail * rest_model.CurrentAPISessionDetail
92+ RequestHeaders http.Header
93+ }
94+
95+ func (a * ApiSessionLegacy ) GetRequestHeaders () http.Header {
96+ return a .RequestHeaders
9097}
9198
9299func (a * ApiSessionLegacy ) RequiresRouterTokenUpdate () bool {
@@ -119,8 +126,15 @@ func (a *ApiSessionLegacy) AuthenticateRequest(request runtime.ClientRequest, _
119126 return errors .New ("api session is nil" )
120127 }
121128
122- header , val := a .GetAccessHeader ()
129+ for h , v := range a .RequestHeaders {
130+ err := request .SetHeaderParam (h , v ... )
131+ if err != nil {
132+ return err
133+ }
134+ }
123135
136+ //legacy does not support multiple zt-session headers, so we can it sfely
137+ header , val := a .GetAccessHeader ()
124138 err := request .SetHeaderParam (header , val )
125139 if err != nil {
126140 return err
@@ -151,7 +165,12 @@ func (a *ApiSessionLegacy) GetExpiresAt() *time.Time {
151165
152166// ApiSessionOidc represents an authenticated session backed by OIDC tokens.
153167type ApiSessionOidc struct {
154- OidcTokens * oidc.Tokens [* oidc.IDTokenClaims ]
168+ OidcTokens * oidc.Tokens [* oidc.IDTokenClaims ]
169+ RequestHeaders http.Header
170+ }
171+
172+ func (a * ApiSessionOidc ) GetRequestHeaders () http.Header {
173+ return a .RequestHeaders
155174}
156175
157176func (a * ApiSessionOidc ) RequiresRouterTokenUpdate () bool {
@@ -203,9 +222,31 @@ func (a *ApiSessionOidc) AuthenticateRequest(request runtime.ClientRequest, _ st
203222 return errors .New ("api session is nil" )
204223 }
205224
206- header , val := a .GetAccessHeader ()
225+ if a .RequestHeaders == nil {
226+ a .RequestHeaders = http.Header {}
227+ }
228+
229+ //multiple Authorization headers are allowed, obtain all auth header candidates
230+ primaryAuthHeader , primaryAuthValue := a .GetAccessHeader ()
231+ altAuthValues := a .RequestHeaders .Get (primaryAuthHeader )
232+
233+ authValues := []string {primaryAuthValue }
234+
235+ if len (altAuthValues ) > 0 {
236+ authValues = append (authValues , altAuthValues )
237+ }
238+
239+ //set request headers
240+ for h , v := range a .RequestHeaders {
241+ err := request .SetHeaderParam (h , v ... )
242+ if err != nil {
243+ return err
244+ }
245+ }
246+
247+ //restore auth headers
248+ err := request .SetHeaderParam (primaryAuthHeader , authValues ... )
207249
208- err := request .SetHeaderParam (header , val )
209250 if err != nil {
210251 return err
211252 }
@@ -320,7 +361,9 @@ func (self *ZitiEdgeManagement) legacyAuth(credentials Credentials, configTypes
320361 return nil , err
321362 }
322363
323- return & ApiSessionLegacy {Detail : resp .GetPayload ().Data }, err
364+ return & ApiSessionLegacy {
365+ Detail : resp .GetPayload ().Data ,
366+ RequestHeaders : credentials .GetRequestHeaders ()}, err
324367}
325368
326369func (self * ZitiEdgeManagement ) oidcAuth (credentials Credentials , configTypeOverrides []string , httpClient * http.Client ) (ApiSession , error ) {
@@ -355,7 +398,8 @@ func (self *ZitiEdgeManagement) RefreshApiSession(apiSession ApiSession, httpCli
355398 }
356399
357400 return & ApiSessionOidc {
358- OidcTokens : tokens ,
401+ OidcTokens : tokens ,
402+ RequestHeaders : apiSession .GetRequestHeaders (),
359403 }, nil
360404 }
361405
@@ -453,7 +497,7 @@ func (self *ZitiEdgeClient) legacyAuth(credentials Credentials, configTypes []st
453497 return nil , err
454498 }
455499
456- return & ApiSessionLegacy {Detail : resp .GetPayload ().Data }, err
500+ return & ApiSessionLegacy {Detail : resp .GetPayload ().Data , RequestHeaders : credentials . GetRequestHeaders () }, err
457501}
458502
459503func (self * ZitiEdgeClient ) oidcAuth (credentials Credentials , configTypeOverrides []string , httpClient * http.Client ) (ApiSession , error ) {
@@ -480,7 +524,8 @@ func (self *ZitiEdgeClient) RefreshApiSession(apiSession ApiSession, httpClient
480524 }
481525
482526 newApiSession := & ApiSessionLegacy {
483- Detail : newApiSessionDetail .Payload .Data ,
527+ Detail : newApiSessionDetail .Payload .Data ,
528+ RequestHeaders : apiSession .GetRequestHeaders (),
484529 }
485530
486531 return newApiSession , nil
@@ -492,7 +537,8 @@ func (self *ZitiEdgeClient) RefreshApiSession(apiSession ApiSession, httpClient
492537 }
493538
494539 return & ApiSessionOidc {
495- OidcTokens : tokens ,
540+ OidcTokens : tokens ,
541+ RequestHeaders : apiSession .GetRequestHeaders (),
496542 }, nil
497543 }
498544
@@ -748,7 +794,8 @@ func oidcAuth(clientTransportPool ClientTransportPool, credentials Credentials,
748794 }
749795
750796 return & ApiSessionOidc {
751- OidcTokens : outTokens ,
797+ OidcTokens : outTokens ,
798+ RequestHeaders : credentials .GetRequestHeaders (),
752799 }, nil
753800}
754801
0 commit comments