Sandor Molnar created KNOX-3399:
-----------------------------------

             Summary: RFC 8693 token exchange (handleTokenExchange) unreachable 
for x-www-form-urlencoded POSTs
                 Key: KNOX-3399
                 URL: https://issues.apache.org/jira/browse/KNOX-3399
             Project: Apache Knox
          Issue Type: Bug
          Components: Server
    Affects Versions: 3.0.0
            Reporter: Sandor Molnar
            Assignee: Sandor Molnar
             Fix For: 3.0.0


{{JWTFederationFilter.doFilter}} reads {{grant_type}} via {{getParameter}} on 
the wrapped request. Form-encoded requests are wrapped in 
{{UrlEncodedFormRequest}}, whose {{getParameter}} returns query-string values 
only and ignores the body (by design). So for a standard RFC 8693 POST (grant + 
tokens in the body), {{grant_type}} reads back {{null}}, the 
{{handleTokenExchange}} branch is skipped, and the request falls through to the 
single-token path - which validates only {{subject_token}} and silently ignores 
{{actor_token}}.

*Impact:* the two-token OBO flow never runs over the normal content type. A 
POST with *no* {{actor_token}} still returns 200:

{code}
$ curl -k -X POST 
"https://localhost:8443/gateway/tokenexchange/knoxtoken/api/v2/token"; -H 
"Content-Type: application/x-www-form-urlencoded" -d 
"grant_type=urn:ietf:params:oauth:grant-type:token-exchange&subject_token=$SUBJECT_TOKEN"
{"access_token":"eyJqa3UiOi...","token_id":"e313ffbc-b27e-468e-a684-192b8939ca87","managed":"true","endpoint_public_cert":"MIIDZDE...ETTA="
{code}

*Evidence (remote debugger, on v3.0.0 branch):* 
{{httpRequest.getParameter("grant_type") → null}} whereas 
{{ServletRequestUtils.unwrapHttpServletRequest(request).getParameter("grant_type")
 → the expected URN}}.

*Fix direction:* in {{doFilter}}, read {{grant_type}} from the unwrapped 
request (guard on absent Authorization header so proxied bodies aren't 
consumed); read subject_token/actor_token from the unwrapped request in 
{{handleTokenExchange}}; keep passing the wrapped request downstream. Add a 
regression test in {{OAuthFlowsFederationFilterTest}} posting grant + both 
tokens in the body (wrapped in {{UrlEncodedFormRequest}}).



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to