fix: allow native clients to use https:// on localhost redirects (#691)
This commit is contained in:
parent
867a4806fd
commit
de2fd41f40
2 changed files with 30 additions and 9 deletions
|
@ -312,12 +312,12 @@ func ValidateAuthReqRedirectURI(client Client, uri string, responseType oidc.Res
|
||||||
return oidc.ErrInvalidRequestRedirectURI().WithDescription("The redirect_uri is missing in the request. " +
|
return oidc.ErrInvalidRequestRedirectURI().WithDescription("The redirect_uri is missing in the request. " +
|
||||||
"Please ensure it is added to the request. If you have any questions, you may contact the administrator of the application.")
|
"Please ensure it is added to the request. If you have any questions, you may contact the administrator of the application.")
|
||||||
}
|
}
|
||||||
if strings.HasPrefix(uri, "https://") {
|
|
||||||
return checkURIAgainstRedirects(client, uri)
|
|
||||||
}
|
|
||||||
if client.ApplicationType() == ApplicationTypeNative {
|
if client.ApplicationType() == ApplicationTypeNative {
|
||||||
return validateAuthReqRedirectURINative(client, uri)
|
return validateAuthReqRedirectURINative(client, uri)
|
||||||
}
|
}
|
||||||
|
if strings.HasPrefix(uri, "https://") {
|
||||||
|
return checkURIAgainstRedirects(client, uri)
|
||||||
|
}
|
||||||
if err := checkURIAgainstRedirects(client, uri); err != nil {
|
if err := checkURIAgainstRedirects(client, uri); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -338,12 +338,15 @@ func ValidateAuthReqRedirectURI(client Client, uri string, responseType oidc.Res
|
||||||
// ValidateAuthReqRedirectURINative validates the passed redirect_uri and response_type to the registered uris and client type
|
// ValidateAuthReqRedirectURINative validates the passed redirect_uri and response_type to the registered uris and client type
|
||||||
func validateAuthReqRedirectURINative(client Client, uri string) error {
|
func validateAuthReqRedirectURINative(client Client, uri string) error {
|
||||||
parsedURL, isLoopback := HTTPLoopbackOrLocalhost(uri)
|
parsedURL, isLoopback := HTTPLoopbackOrLocalhost(uri)
|
||||||
isCustomSchema := !strings.HasPrefix(uri, "http://")
|
isCustomSchema := !(strings.HasPrefix(uri, "http://") || strings.HasPrefix(uri, "https://"))
|
||||||
if err := checkURIAgainstRedirects(client, uri); err == nil {
|
if err := checkURIAgainstRedirects(client, uri); err == nil {
|
||||||
if client.DevMode() {
|
if client.DevMode() {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// The RedirectURIs are only valid for native clients when localhost or non-"http://"
|
if !isLoopback && strings.HasPrefix(uri, "https://") {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
// The RedirectURIs are only valid for native clients when localhost or non-"http://" and "https://"
|
||||||
if isLoopback || isCustomSchema {
|
if isLoopback || isCustomSchema {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -373,12 +376,12 @@ func HTTPLoopbackOrLocalhost(rawURL string) (*url.URL, bool) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, false
|
return nil, false
|
||||||
}
|
}
|
||||||
if parsedURL.Scheme != "http" {
|
if parsedURL.Scheme == "http" || parsedURL.Scheme == "https" {
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
hostName := parsedURL.Hostname()
|
hostName := parsedURL.Hostname()
|
||||||
return parsedURL, hostName == "localhost" || net.ParseIP(hostName).IsLoopback()
|
return parsedURL, hostName == "localhost" || net.ParseIP(hostName).IsLoopback()
|
||||||
}
|
}
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
|
||||||
// ValidateAuthReqResponseType validates the passed response_type to the registered response types
|
// ValidateAuthReqResponseType validates the passed response_type to the registered response types
|
||||||
func ValidateAuthReqResponseType(client Client, responseType oidc.ResponseType) error {
|
func ValidateAuthReqResponseType(client Client, responseType oidc.ResponseType) error {
|
||||||
|
|
|
@ -433,6 +433,24 @@ func TestValidateAuthReqRedirectURI(t *testing.T) {
|
||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"code flow registered https loopback v4 native ok",
|
||||||
|
args{
|
||||||
|
"https://127.0.0.1:4200/callback",
|
||||||
|
mock.NewClientWithConfig(t, []string{"https://127.0.0.1/callback"}, op.ApplicationTypeNative, nil, false),
|
||||||
|
oidc.ResponseTypeCode,
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"code flow registered https loopback v6 native ok",
|
||||||
|
args{
|
||||||
|
"https://[::1]:4200/callback",
|
||||||
|
mock.NewClientWithConfig(t, []string{"https://[::1]/callback"}, op.ApplicationTypeNative, nil, false),
|
||||||
|
oidc.ResponseTypeCode,
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"code flow unregistered http native fails",
|
"code flow unregistered http native fails",
|
||||||
args{
|
args{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue