comparison mod_http_oauth2/mod_http_oauth2.lua @ 5246:fd0d25b42cd9

mod_http_oauth2: Validate all URIs against client_uri in client registration Validating against all redirect URIs didn't work for OOB-only clients, which happens to be what I was testing with.
author Kim Alvefur <zash@zash.se>
date Sun, 12 Mar 2023 12:06:44 +0100
parents e22cae58141d
children dc27b997e969
comparison
equal deleted inserted replaced
5245:e22cae58141d 5246:fd0d25b42cd9
598 598
599 if not schema.validate(registration_schema, client_metadata) then 599 if not schema.validate(registration_schema, client_metadata) then
600 return oauth_error("invalid_request", "Failed schema validation."); 600 return oauth_error("invalid_request", "Failed schema validation.");
601 end 601 end
602 602
603 local redirect_hosts = set.new(); 603 local client_uri = url.parse(client_metadata.client_uri);
604 if not client_uri or client_uri.scheme ~= "https" then
605 return oauth_error("invalid_request", "Missing, invalid or insecure client_uri");
606 end
607
604 for _, redirect_uri in ipairs(client_metadata.redirect_uris) do 608 for _, redirect_uri in ipairs(client_metadata.redirect_uris) do
605 local components = url.parse(redirect_uri); 609 local components = url.parse(redirect_uri);
606 if not components or not components.scheme then 610 if not components or not components.scheme then
607 return oauth_error("invalid_request", "Invalid redirect URI."); 611 return oauth_error("invalid_request", "Invalid redirect URI.");
608 elseif components.scheme == "http" and components.host ~= "localhost" then 612 elseif components.scheme == "http" and components.host ~= "localhost" then
609 return oauth_error("invalid_request", "Insecure redirect URI forbidden (except http://localhost)"); 613 return oauth_error("invalid_request", "Insecure redirect URI forbidden (except http://localhost)");
610 elseif components.scheme == "https" then 614 elseif components.scheme == "https" and components.host ~= client_uri.host then
611 redirect_hosts:add(components.host); 615 return oauth_error("invalid_request", "Redirects must use the same hostname as client_uri");
612 end 616 end
613 end 617 end
614 618
615 for field, prop_schema in pairs(registration_schema.properties) do 619 for field, prop_schema in pairs(registration_schema.properties) do
616 if prop_schema.format == "uri" and client_metadata[field] then 620 if field ~= "client_uri" and prop_schema.format == "uri" and client_metadata[field] then
617 local components = url.parse(client_metadata[field]); 621 local components = url.parse(client_metadata[field]);
618 if components.scheme ~= "https" then 622 if components.scheme ~= "https" then
619 return oauth_error("invalid_request", "Insecure URI forbidden"); 623 return oauth_error("invalid_request", "Insecure URI forbidden");
620 end 624 end
621 if not redirect_hosts:contains(components.host) then 625 if components.authority ~= client_uri.authority then
622 return oauth_error("invalid_request", "Informative URI must match redirect URIs"); 626 return oauth_error("invalid_request", "Informative URIs must have the same hostname");
623 end 627 end
624 end 628 end
625 end 629 end
626 630
627 -- Ensure each signed client_id JWT is unique, short ID and issued at 631 -- Ensure each signed client_id JWT is unique, short ID and issued at