Ronan-WeScale opened a new issue, #12908:
URL: https://github.com/apache/apisix/issues/12908

   ### Description
   
   ## Description
   
   The `key-auth` plugin currently only supports custom header names (default: 
`apikey`) for API key authentication. However, it does not support the standard 
OAuth 2.0 Bearer token format (`Authorization: Bearer <token>`), which is 
widely used in modern APIs and is the standard way to pass authentication 
tokens.
   
   ## Current Behavior
   
   Currently, when using the `key-auth` plugin:
   - The API key can be passed via a custom header (default: `apikey`) or query 
parameter
   - The `header` parameter allows customization of the header name
   - Example: `apikey: my-secret-key` or `X-API-KEY: my-secret-key`
   
   ## Expected Behavior
   
   The plugin should support the standard Bearer token format:
   - Accept tokens in the format: `Authorization: Bearer <token>`
   - When enabled, the plugin should:
     - Force the use of the `Authorization` header (ignoring the `header` 
parameter)
     - Extract the token after the "Bearer " prefix
     - Validate the token format strictly
     - Update the `WWW-Authenticate` response header to use "Bearer" scheme 
instead of "apikey"
   
   ## Use Case
   
   Many APIs and OAuth 2.0-based authentication systems use the Bearer token 
format as a standard. Supporting this format in the `key-auth` plugin would:
   
   1. **Standards Compliance**: Follow RFC 6750 (Bearer Token Usage) and OAuth 
2.0 specifications
   2. **Interoperability**: Allow APISIX to work seamlessly with existing OAuth 
2.0 clients and tools
   3. **Migration**: Enable easier migration from other API gateways that 
support Bearer tokens
   4. **Developer Experience**: Provide familiar authentication patterns that 
developers expect
   
   ## Proposed Solution
   
   Add a new boolean parameter `bearer_token` to the plugin schema:
   
   ```json
   {
     "plugins": {
       "key-auth": {
         "bearer_token": true
       }
     }
   }
   ```
   
   When `bearer_token` is set to `true`:
   - The plugin should read from the `Authorization` header only
   - Extract the token after "Bearer " prefix
   - Return `401` with error message "Invalid Bearer token format" if the 
prefix is missing
   - Set `WWW-Authenticate: Bearer realm="key"` in error responses
   
   ## Example Configuration
   
   ```bash
   # Create a consumer
   curl "http://127.0.0.1:9180/apisix/admin/consumers"; -X PUT \
     -H "X-API-KEY: ${admin_key}" \
     -d '{
       "username": "jack",
       "plugins": {
         "key-auth": {
           "key": "my-secret-token"
         }
       }
     }'
   
   # Create a route with bearer_token enabled
   curl "http://127.0.0.1:9180/apisix/admin/routes/1"; -X PUT \
     -H "X-API-KEY: ${admin_key}" \
     -d '{
       "uri": "/protected",
       "plugins": {
         "key-auth": {
           "bearer_token": true
         }
       },
       "upstream": {
         "type": "roundrobin",
         "nodes": {
           "httpbin.org:80": 1
         }
       }
     }'
   
   # Valid request
   curl "http://127.0.0.1:9080/protected"; \
     -H "Authorization: Bearer my-secret-token"
   # Returns: 200 OK
   
   # Invalid request (missing Bearer prefix)
   curl "http://127.0.0.1:9080/protected"; \
     -H "Authorization: my-secret-token"
   # Returns: 401 Unauthorized
   # Response: {"message":"Invalid Bearer token format"}
   ```
   
   ## Benefits
   
   - Backward compatible (default: `false`)
   - No breaking changes to existing configurations
   - Follows OAuth 2.0 and RFC 6750 standards
   - Simple to implement and use
   - Improves security by enforcing standard token format
   
   ## Alternative Considered
   
   Using the existing `header` parameter set to "Authorization" doesn't work 
because:
   1. It doesn't validate the "Bearer " prefix
   2. The `WWW-Authenticate` response header still uses "apikey" scheme
   3. Tokens without "Bearer " prefix would be accepted, which is non-standard
   
   ## Environment
   
   - APISIX Version: [version]
   - Operating System: [OS]
   - Deployment: [Docker/Bare Metal/Kubernetes]
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to