package providers import ( "fmt" "net/http" "net/url" ) const ( tokenTypeBearer = "Bearer" tokenTypeToken = "token" acceptHeader = "Accept" acceptApplicationJSON = "application/json" ) func makeAuthorizationHeader(prefix, token string, extraHeaders map[string]string) http.Header { header := make(http.Header) for key, value := range extraHeaders { header.Add(key, value) } header.Set("Authorization", fmt.Sprintf("%s %s", prefix, token)) return header } func makeOIDCHeader(accessToken string) http.Header { // extra headers required by the IDP when making authenticated requests extraHeaders := map[string]string{ acceptHeader: acceptApplicationJSON, } return makeAuthorizationHeader(tokenTypeBearer, accessToken, extraHeaders) } func makeLoginURL(p *ProviderData, redirectURI, state string, extraParams url.Values) url.URL { a := *p.LoginURL params, _ := url.ParseQuery(a.RawQuery) params.Set("redirect_uri", redirectURI) if p.AcrValues != "" { params.Add("acr_values", p.AcrValues) } if p.Prompt != "" { params.Set("prompt", p.Prompt) } else { // Legacy variant of the prompt param: params.Set("approval_prompt", p.ApprovalPrompt) } params.Add("scope", p.Scope) params.Set("client_id", p.ClientID) params.Set("response_type", "code") params.Add("state", state) for n, p := range extraParams { for _, v := range p { params.Add(n, v) } } a.RawQuery = params.Encode() return a }