[ 
https://issues.apache.org/jira/browse/KNOX-3016?focusedWorklogId=909154&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-909154
 ]

ASF GitHub Bot logged work on KNOX-3016:
----------------------------------------

                Author: ASF GitHub Bot
            Created on: 11/Mar/24 10:58
            Start Date: 11/Mar/24 10:58
    Worklog Time Spent: 10m 
      Work Description: smolnar82 commented on code in PR #876:
URL: https://github.com/apache/knox/pull/876#discussion_r1519517586


##########
gateway-provider-security-jwt/src/main/java/org/apache/knox/gateway/provider/federation/jwt/filter/JWTFederationFilter.java:
##########
@@ -238,10 +241,33 @@ public Pair<TokenType, String> getWireToken(final 
ServletRequest request) {
           }
       }
 
+      /*
+      POST /{tenant}/oauth2/v2.0/token HTTP/1.1
+      Host: login.microsoftonline.com:443
+      Content-Type: application/x-www-form-urlencoded
+
+      client_id=535fb089-9ff3-47b6-9bfb-4f1264799865
+      &scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
+      &client_secret=sampleCredentials
+      &grant_type=client_credentials
+       */
+
+      // Let's check whether this is a client credentials oauth request or 
whether
+      // the token has been configured for another usecase specific header
       if (parsed == null) {
-          token = request.getParameter(this.paramName);
-          if (token != null) {
-            parsed = Pair.of(TokenType.JWT, token);
+          String grantType = request.getParameter(GRANT_TYPE);
+          if (CLIENT_CREDENTIALS.equals(grantType)) {
+            // this is indeed a client credentials flow client_id and
+            // client_secret are expected now the client_id will be in
+            // the token as the token_id so we will get that later
+            token = request.getParameter(CLIENT_SECRET);
+            parsed = Pair.of(TokenType.Passcode, token);
+          }

Review Comment:
   I think this code - along with the above comment that explains the different 
query parameters in a client credentials flow request - deserves to be in a 
private method and can be added before the original `parsed == null` check. 
This way it's easier to read, IMO.
   
   For instance:
   ```
   // Let's check whether this is a client credentials oauth request
   parsed = parsed == null ? parseOauthRequestClientCredentials(request) : 
parsed;
   
   // Finally, whether the token has been configured for another usecase 
specific header
   if (parsed == null) {
      ...
   
   ```



##########
gateway-provider-security-jwt/src/main/java/org/apache/knox/gateway/provider/federation/jwt/filter/AbstractJWTFilter.java:
##########
@@ -300,8 +302,23 @@ protected Subject createSubjectFromToken(final JWT token) 
throws UnknownTokenExc
 
   public Subject createSubjectFromTokenIdentifier(final String tokenId) throws 
UnknownTokenException {
     TokenMetadata metadata = tokenStateService.getTokenMetadata(tokenId);
+    String username = null;
     if (metadata != null) {
-      return createSubjectFromTokenData(metadata.getUserName(), null);
+      String type =  metadata.getMetadata(TYPE);

Review Comment:
   As you indicated in the PR's description,
   > This change introduces only the acceptance of the Knox TokenID and 
Passcode tokens as CLIENT_ID and CLIENT_SECRET in a standard OAuth 2.0 client 
credentials flow request body
   
   Based on this, I've to ask if there is going to be a separate PR where the 
`type` metadata is created when OAuth clients get a new token (and replay the 
`tokenId` and `passcode` fields as `CLIENT_ID` and `CLIENT_SECRET`)?



##########
gateway-provider-security-jwt/src/main/java/org/apache/knox/gateway/provider/federation/jwt/filter/AbstractJWTFilter.java:
##########
@@ -300,8 +302,23 @@ protected Subject createSubjectFromToken(final JWT token) 
throws UnknownTokenExc
 
   public Subject createSubjectFromTokenIdentifier(final String tokenId) throws 
UnknownTokenException {
     TokenMetadata metadata = tokenStateService.getTokenMetadata(tokenId);
+    String username = null;
     if (metadata != null) {
-      return createSubjectFromTokenData(metadata.getUserName(), null);
+      String type =  metadata.getMetadata(TYPE);
+      // using tokenID and passcode as CLIENT_ID and CLIENT_SECRET will
+      // result in a metadata item called "type". If the valid is set

Review Comment:
   I'm not sure I understand this sentence. Did you mean "if the `type` is set 
to CLIENT_ID"?





Issue Time Tracking
-------------------

    Worklog Id:     (was: 909154)
    Time Spent: 20m  (was: 10m)

> Add Support for Client Credentials Flow with KnoxTokens
> -------------------------------------------------------
>
>                 Key: KNOX-3016
>                 URL: https://issues.apache.org/jira/browse/KNOX-3016
>             Project: Apache Knox
>          Issue Type: Bug
>          Components: JWT
>            Reporter: Larry McCay
>            Assignee: Larry McCay
>            Priority: Major
>             Fix For: 2.1.0
>
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> Adding support for integrations to Knox proxied services and APIs via OAuth 
> style cllient credentials flow. This allows an integration that is provided a 
> CLIENT_ID and CLIENT_SECRET to authenticate to Knox and directly access 
> proxied services with those or exchange those credentials for short lived JWT 
> based access, id and refresh tokens.
> This change introduces only the acceptance of the Knox TokenID and Passcode 
> tokens as CLIENT_ID and CLIENT_SECRET in a standard OAuth 2.0 client 
> credentials flow request body. This body will contain the following params:
> 1. grant_type and it will be "client_credentials"
> 2. client_id which will be the KnoxToken tokenId or KnoxID
> 3. client_secret which will be the passcode token for which we store the hash
> Authentication using this flow will result in the effective user being what 
> is provided as the CLIENT_ID.



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

Reply via email to