Skip to content

Commit 3c737c7

Browse files
authored
add idp hint flow (#3)
1 parent 68a477d commit 3c737c7

File tree

5 files changed

+24
-5
lines changed

5 files changed

+24
-5
lines changed

pkg/authn/respond_http.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ func (p *Portal) injectRedirectURL(ctx context.Context, w http.ResponseWriter, r
266266
if r.Method == "GET" {
267267
q := r.URL.Query()
268268
if redirectURL, exists := q["redirect_url"]; exists {
269-
c := p.cookie.GetCookie(addrutil.GetSourceHost(r), p.cookie.Referer, util.StripQueryParam(redirectURL[0], "login_hint"))
269+
c := p.cookie.GetCookie(addrutil.GetSourceHost(r), p.cookie.Referer, util.StripQueryParam(util.StripQueryParam(redirectURL[0], "login_hint"), "idp_hint"))
270270
p.logger.Debug(
271271
"redirect recorded",
272272
zap.String("session_id", rr.Upstream.SessionID),

pkg/authz/authenticate.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,9 @@ func (g *Gatekeeper) handleLoginHint(r *http.Request, ar *requests.Authorization
334334
ar.Redirect.LoginHint = loginHint
335335
}
336336
}
337+
if idpHint := r.URL.Query().Get("idp_hint"); idpHint != "" {
338+
ar.Redirect.IDPHint = idpHint
339+
}
337340
}
338341

339342
func (g *Gatekeeper) handleAdditionalScopes(r *http.Request, ar *requests.AuthorizationRequest) {

pkg/authz/handlers/redirect.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@ package handlers
1616

1717
import (
1818
"fmt"
19-
"github.com/greenpau/go-authcrunch/pkg/requests"
20-
addrutil "github.com/greenpau/go-authcrunch/pkg/util/addr"
2119
"html/template"
2220
"net/http"
2321
"net/url"
2422
"strings"
23+
24+
"github.com/greenpau/go-authcrunch/pkg/requests"
25+
addrutil "github.com/greenpau/go-authcrunch/pkg/util/addr"
2526
)
2627

2728
var jsRedirTmpl = template.Must(template.New("js_redir").Parse(`
@@ -132,6 +133,13 @@ func configureRedirect(w http.ResponseWriter, r *http.Request, rr *requests.Auth
132133
rr.Redirect.Separator = "&"
133134
}
134135

136+
if len(rr.Redirect.IDPHint) > 0 {
137+
idpHint := rr.Redirect.IDPHint
138+
escapedIDPHint := url.QueryEscape(idpHint)
139+
rr.Redirect.AuthURL = fmt.Sprintf("%s%sidp_hint=%s", rr.Redirect.AuthURL, rr.Redirect.Separator, escapedIDPHint)
140+
rr.Redirect.Separator = "&"
141+
}
142+
135143
if len(rr.Redirect.AdditionalScopes) > 0 {
136144
additionalScopes := rr.Redirect.AdditionalScopes
137145
escapedAdditionalScopes := url.QueryEscape(additionalScopes)

pkg/idp/oauth/authenticate.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ func (b *IdentityProvider) Authenticate(r *requests.Request) error {
3737
reqPath := r.Upstream.BaseURL + path.Join(r.Upstream.BasePath, r.Upstream.Method, r.Upstream.Realm)
3838
r.Response.Code = http.StatusBadRequest
3939

40-
var accessTokenExists, idTokenExists, codeExists, stateExists, errorExists, loginHintExists, additionalScopesExists bool
41-
var reqParamsAccessToken, reqParamsIDToken, reqParamsState, reqParamsCode, reqParamsError, reqParamsLoginHint, additionalScopes string
40+
var accessTokenExists, idTokenExists, codeExists, stateExists, errorExists, loginHintExists, idpHintExists, additionalScopesExists bool
41+
var reqParamsAccessToken, reqParamsIDToken, reqParamsState, reqParamsCode, reqParamsError, reqParamsLoginHint, reqParamsIDPHint, additionalScopes string
4242
reqParams := r.Upstream.Request.URL.Query()
4343
if _, exists := reqParams["access_token"]; exists {
4444
accessTokenExists = true
@@ -64,6 +64,10 @@ func (b *IdentityProvider) Authenticate(r *requests.Request) error {
6464
loginHintExists = true
6565
reqParamsLoginHint = reqParams["login_hint"][0]
6666
}
67+
if _, exists := reqParams["idp_hint"]; exists {
68+
idpHintExists = true
69+
reqParamsIDPHint = reqParams["idp_hint"][0]
70+
}
6771
if _, exists := reqParams["additional_scopes"]; exists {
6872
additionalScopesExists = true
6973
additionalScopes = reqParams["additional_scopes"][0]
@@ -238,6 +242,9 @@ func (b *IdentityProvider) Authenticate(r *requests.Request) error {
238242
if loginHintExists {
239243
params.Set("login_hint", reqParamsLoginHint)
240244
}
245+
if idpHintExists {
246+
params.Set("kc_idp_hint", reqParamsIDPHint)
247+
}
241248

242249
params.Set("client_id", b.config.ClientID)
243250

pkg/requests/authz.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ type RedirectResponse struct {
5050
URL string `json:"url,omitempty" xml:"url,omitempty" yaml:"url,omitempty"`
5151
StatusCode int `json:"status_code,omitempty" xml:"status_code,omitempty" yaml:"status_code,omitempty"`
5252
LoginHint string `json:"login_hint,omitempty" xml:"login_hint,omitempty" yaml:"login_hint,omitempty"`
53+
IDPHint string `json:"idp_hint,omitempty" xml:"idp_hint,omitempty" yaml:"idp_hint,omitempty"`
5354
AdditionalScopes string `json:"additional_scopes,omitempty" xml:"additional_scopes,omitempty" yaml:"additional_scopes,omitempty"`
5455
}
5556

0 commit comments

Comments
 (0)