Daniel Chaffelson created NIFI-14852:
----------------------------------------

             Summary: Declare Bearer Authentication in NiFi Core OpenAPI Spec
                 Key: NIFI-14852
                 URL: https://issues.apache.org/jira/browse/NIFI-14852
             Project: Apache NiFi
          Issue Type: Bug
          Components: NiFi API
    Affects Versions: 2.5.0
            Reporter: Daniel Chaffelson


The OpenAPI specification for the Apache NiFi Core API is missing the required 
security scheme definition for its primary authorization method. While the API 
correctly enforces that clients must use *HTTP Bearer Authentication* (with a 
JWT) for all protected endpoints, the spec does not declare the {{bearerAuth}} 
security scheme.

This omission prevents standard OpenAPI client generators from creating clients 
that can apply the necessary {{Authorization}} header out-of-the-box, requiring 
manual workarounds.

*Problem Details*

In NiFi, the authentication and authorization flow is as follows:
 # A client calls {{POST /nifi-api/access/token}} with form parameters 
({{{}username{}}}, {{{}password{}}}) to receive a JWT. This endpoint does *not* 
use an HTTP authentication scheme like Basic auth.

 # For all subsequent API calls to protected endpoints, the client must include 
the {{Authorization: Bearer <jwt>}} header.

The current {{openapi.json}} spec for the NiFi API fails to model the second 
part of this flow. It is missing:
 * *Security Scheme Definition:* There is no entry in 
{{components.securitySchemes}} to define the {{bearerAuth}} scheme.

 * *Global Security Application:* No global {{security}} block is applied to 
indicate that endpoints are, by default, protected by Bearer auth.

*Impact*

This spec incompliance directly impacts any team using OpenAPI-compliant code 
generation tools to create clients for the NiFi Server API.
 * Generated clients do not automatically add the required {{Authorization: 
Bearer <token>}} header to protected API calls.

 * Downstream projects, such as {*}NiPyAPI{*}, are forced to implement and 
maintain client-side logic to inject this header for every request, rather than 
relying on behavior defined by the API specification.

 * This creates a maintenance burden and deviates from the best practice of 
having a self-describing API contract.

h3. Proposed Solution

To align the OpenAPI specification with the actual API behavior, the following 
changes should be made.

*1. Define the Bearer Auth Security Scheme*

Add the {{bearerAuth}} scheme to the {{components.securitySchemes}} object.

 

{{}}
{code:java}

{code}
{{"components": \{
  "securitySchemes": {
    "bearerAuth": {
      "type": "http",
      "scheme": "bearer",
      "bearerFormat": "JWT"
    }
  }
  // ... existing components
}}}

{{ }}

 

*2. Apply Bearer Auth as the Global Default*

Since most endpoints are protected by Bearer auth, this should be set as the 
global default at the root of the spec.

 
{code:java}
 "security": [ { "bearerAuth": [] }]
{code}
{{}}

*3. Exclude the Login Endpoint from Global Security*

The form-based login endpoint must be explicitly excluded from the global 
Bearer auth requirement. This is done by providing an empty {{security}} array 
for that specific operation.

 

{{}}
{code:java}
"paths": {
  "/nifi-api/access/token": {
    "post": {
      "security": [],
      ...
    }
  }
}{code}
{{ }}
h3. Expected Outcome

By implementing these changes, the NiFi Server API specification will become 
fully self-descriptive regarding its authorization requirements. OpenAPI client 
generators will be able to produce clients that correctly apply the 
{{Authorization: Bearer}} header to all protected endpoints without requiring 
manual, client-side intervention. This simplifies integration and aligns the 
project with OpenAPI best practices.
h3. References
 * [OpenAPI Security Scheme 
Object|https://spec.openapis.org/oas/v3.0.3#security-scheme-object]

 * [RFC 6750: The OAuth 2.0 Authorization Framework: Bearer Token 
Usage|https://www.rfc-editor.org/rfc/rfc6750]

*Notes*
 * The per-operation “security” entries referencing capabilities like “Read - 
/flow” are authorization policy descriptors, not HTTP authentication schemes; 
they should remain, but they do not replace declaring Bearer in securitySchemes.

 * No changes are required for Basic auth because NiFi’s login is form-based 
and does not require HTTP Basic, though this could be added as an option to 
offer further standards-based options.



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

Reply via email to