Skip to content

Commit 3a36c63

Browse files
author
Levko Burburas
committed
feat: add custom form_post response writer
1 parent e570564 commit 3a36c63

File tree

8 files changed

+51
-17
lines changed

8 files changed

+51
-17
lines changed

authorize_error.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ func (f *Fosite) WriteAuthorizeError(ctx context.Context, rw http.ResponseWriter
5050
var redirectURIString string
5151
if ar.GetResponseMode() == ResponseModeFormPost {
5252
rw.Header().Set("Content-Type", "text/html;charset=UTF-8")
53-
WriteAuthorizeFormPostResponse(redirectURI.String(), errors, GetPostFormHTMLTemplate(ctx, f), rw)
53+
54+
writeAuthorizeFormPostResponse := GetWriteAuthorizeFormPostResponse(ctx, f)
55+
writeAuthorizeFormPostResponse(rw, GetPostFormHTMLTemplate(ctx, f), redirectURI.String(), errors)
5456
return
5557
} else if ar.GetResponseMode() == ResponseModeFragment {
5658
redirectURIString = redirectURI.String() + "#" + errors.Encode()

authorize_helper.go

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,16 @@ var DefaultFormPostTemplate = template.Must(template.New("form_post").Parse(`<ht
3232
</body>
3333
</html>`))
3434

35+
func DefaultWriteAuthorizeFormPostResponse(rw io.Writer, template *template.Template, redirectURL string, parameters url.Values) {
36+
_ = template.Execute(rw, struct {
37+
RedirURL string
38+
Parameters url.Values
39+
}{
40+
RedirURL: redirectURL,
41+
Parameters: parameters,
42+
})
43+
}
44+
3545
// MatchRedirectURIWithClientRedirectURIs if the given uri is a registered redirect uri. Does not perform
3646
// uri validation.
3747
//
@@ -186,16 +196,6 @@ func IsLocalhost(redirectURI *url.URL) bool {
186196
return strings.HasSuffix(hn, ".localhost") || hn == "127.0.0.1" || hn == "::1" || hn == "localhost"
187197
}
188198

189-
func WriteAuthorizeFormPostResponse(redirectURL string, parameters url.Values, template *template.Template, rw io.Writer) {
190-
_ = template.Execute(rw, struct {
191-
RedirURL string
192-
Parameters url.Values
193-
}{
194-
RedirURL: redirectURL,
195-
Parameters: parameters,
196-
})
197-
}
198-
199199
// Deprecated: Do not use.
200200
func URLSetFragment(source *url.URL, fragment url.Values) {
201201
var f string
@@ -217,3 +217,10 @@ func GetPostFormHTMLTemplate(ctx context.Context, f *Fosite) *template.Template
217217
}
218218
return DefaultFormPostTemplate
219219
}
220+
221+
func GetWriteAuthorizeFormPostResponse(ctx context.Context, f *Fosite) func(rw io.Writer, template *template.Template, redirectURL string, parameters url.Values) {
222+
if t := f.Config.GetWriteAuthorizeFormPostResponse(ctx); t != nil {
223+
return t
224+
}
225+
return DefaultWriteAuthorizeFormPostResponse
226+
}

authorize_helper_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ func TestWriteAuthorizeFormPostResponse(t *testing.T) {
283283
var responseBuffer bytes.Buffer
284284
redirectURL := "https://localhost:8080/cb"
285285
//parameters :=
286-
fosite.WriteAuthorizeFormPostResponse(redirectURL, c.parameters, fosite.DefaultFormPostTemplate, &responseBuffer)
286+
fosite.DefaultWriteAuthorizeFormPostResponse(&responseBuffer, fosite.DefaultFormPostTemplate, redirectURL, c.parameters)
287287
code, state, _, _, customParams, _, err := internal.ParseFormPostResponse(redirectURL, ioutil.NopCloser(bytes.NewReader(responseBuffer.Bytes())))
288288
assert.NoError(t, err, "case %d", d)
289289
c.check(code, state, customParams, d)

authorize_write.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ func (f *Fosite) WriteAuthorizeResponse(ctx context.Context, rw http.ResponseWri
2424
case ResponseModeFormPost:
2525
//form_post
2626
rw.Header().Add("Content-Type", "text/html;charset=UTF-8")
27-
WriteAuthorizeFormPostResponse(redir.String(), resp.GetParameters(), GetPostFormHTMLTemplate(ctx, f), rw)
27+
28+
writeAuthorizeFormPostResponse := GetWriteAuthorizeFormPostResponse(ctx, f)
29+
writeAuthorizeFormPostResponse(rw, GetPostFormHTMLTemplate(ctx, f), redir.String(), resp.GetParameters())
2830
return
2931
case ResponseModeQuery, ResponseModeDefault:
3032
// Explicit grants

config.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"context"
88
"hash"
99
"html/template"
10+
"io"
1011
"net/url"
1112
"time"
1213

@@ -240,6 +241,12 @@ type FormPostHTMLTemplateProvider interface {
240241
GetFormPostHTMLTemplate(ctx context.Context) *template.Template
241242
}
242243

244+
// WriteAuthorizeFormPostResponseProvider returns the provider for writing authorize form_post response.
245+
type WriteAuthorizeFormPostResponseProvider interface {
246+
// GetWriteAuthorizeFormPostResponse returns the returns the function for writing form_post response.
247+
GetWriteAuthorizeFormPostResponse(ctx context.Context) func(rw io.Writer, template *template.Template, redirectURL string, parameters url.Values)
248+
}
249+
243250
type TokenURLProvider interface {
244251
// GetTokenURL returns the token URL.
245252
GetTokenURL(ctx context.Context) string

config_default.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"context"
88
"hash"
99
"html/template"
10+
"io"
1011
"net/url"
1112
"time"
1213

@@ -52,6 +53,7 @@ var (
5253
_ ResponseModeHandlerExtensionProvider = (*Config)(nil)
5354
_ MessageCatalogProvider = (*Config)(nil)
5455
_ FormPostHTMLTemplateProvider = (*Config)(nil)
56+
_ WriteAuthorizeFormPostResponseProvider = (*Config)(nil)
5557
_ TokenURLProvider = (*Config)(nil)
5658
_ GetSecretsHashingProvider = (*Config)(nil)
5759
_ HTTPClientProvider = (*Config)(nil)
@@ -160,6 +162,9 @@ type Config struct {
160162
// FormPostHTMLTemplate sets html template for rendering the authorization response when the request has response_mode=form_post.
161163
FormPostHTMLTemplate *template.Template
162164

165+
// WriteAuthorizeFormPostResponse renders authorize form_post response when the request has response_mode=form_post.
166+
WriteAuthorizeFormPostResponse func(rw io.Writer, template *template.Template, redirectURL string, parameters url.Values)
167+
163168
// OmitRedirectScopeParam indicates whether the "scope" parameter should be omitted from the redirect URL.
164169
OmitRedirectScopeParam bool
165170

@@ -268,6 +273,10 @@ func (c *Config) GetFormPostHTMLTemplate(ctx context.Context) *template.Template
268273
return c.FormPostHTMLTemplate
269274
}
270275

276+
func (c *Config) GetWriteAuthorizeFormPostResponse(ctx context.Context) func(rw io.Writer, template *template.Template, redirectURL string, parameters url.Values) {
277+
return c.WriteAuthorizeFormPostResponse
278+
}
279+
271280
func (c *Config) GetMessageCatalog(ctx context.Context) i18n.MessageCatalog {
272281
return c.MessageCatalog
273282
}

fosite.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ type Configurator interface {
124124
ResponseModeHandlerExtensionProvider
125125
MessageCatalogProvider
126126
FormPostHTMLTemplateProvider
127+
WriteAuthorizeFormPostResponseProvider
127128
TokenURLProvider
128129
GetSecretsHashingProvider
129130
AuthorizeEndpointHandlersProvider

integration/authorize_form_post_test.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -208,15 +208,21 @@ func (m *decoratedFormPostResponse) ResponseModes() fosite.ResponseModeTypes {
208208
func (m *decoratedFormPostResponse) WriteAuthorizeResponse(ctx context.Context, rw http.ResponseWriter, ar fosite.AuthorizeRequester, resp fosite.AuthorizeResponder) {
209209
rw.Header().Add("Content-Type", "text/html;charset=UTF-8")
210210
resp.AddParameter("custom_param", "foo")
211-
fosite.WriteAuthorizeFormPostResponse(ar.GetRedirectURI().String(), resp.GetParameters(), fosite.GetPostFormHTMLTemplate(ctx,
212-
fosite.NewOAuth2Provider(nil, new(fosite.Config))), rw)
211+
212+
provider := fosite.NewOAuth2Provider(nil, new(fosite.Config))
213+
214+
writeAuthorizeFormPostResponse := fosite.GetWriteAuthorizeFormPostResponse(ctx, provider)
215+
writeAuthorizeFormPostResponse(rw, fosite.GetPostFormHTMLTemplate(ctx, provider), ar.GetRedirectURI().String(), resp.GetParameters())
213216
}
214217

215218
func (m *decoratedFormPostResponse) WriteAuthorizeError(ctx context.Context, rw http.ResponseWriter, ar fosite.AuthorizeRequester, err error) {
216219
rfcerr := fosite.ErrorToRFC6749Error(err)
217220
errors := rfcerr.ToValues()
218221
errors.Set("state", ar.GetState())
219222
errors.Add("custom_err_param", "bar")
220-
fosite.WriteAuthorizeFormPostResponse(ar.GetRedirectURI().String(), errors, fosite.GetPostFormHTMLTemplate(ctx,
221-
fosite.NewOAuth2Provider(nil, new(fosite.Config))), rw)
223+
224+
provider := fosite.NewOAuth2Provider(nil, new(fosite.Config))
225+
226+
writeAuthorizeFormPostResponse := fosite.GetWriteAuthorizeFormPostResponse(ctx, provider)
227+
writeAuthorizeFormPostResponse(rw, fosite.GetPostFormHTMLTemplate(ctx, provider), ar.GetRedirectURI().String(), errors)
222228
}

0 commit comments

Comments
 (0)