This is an automated email from the ASF dual-hosted git repository.

greyp pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new 1639ecee11 NIFI-11438 Set standard OpenID Connect Scopes
1639ecee11 is described below

commit 1639ecee11d5ed2502d11e1f97bdb800b5d2bc0a
Author: exceptionfactory <[email protected]>
AuthorDate: Wed Apr 12 17:34:23 2023 -0500

    NIFI-11438 Set standard OpenID Connect Scopes
    
    - Restored previous behavior of sending openid and email scopes for OpenID 
Connect token requests
    - Added offline_access scope as the default value in nifi.properties to 
support Refresh Tokens
    
    This closes #7168
    Signed-off-by: Paul Grey <[email protected]>
---
 nifi-docs/src/main/asciidoc/administration-guide.adoc      |  2 +-
 .../nifi-framework/nifi-resources/pom.xml                  |  3 ++-
 .../registration/StandardClientRegistrationProvider.java   |  9 ++++++---
 .../StandardClientRegistrationProviderTest.java            | 14 ++++++++++++++
 4 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/nifi-docs/src/main/asciidoc/administration-guide.adoc 
b/nifi-docs/src/main/asciidoc/administration-guide.adoc
index aad8cb1250..10f8659c69 100644
--- a/nifi-docs/src/main/asciidoc/administration-guide.adoc
+++ b/nifi-docs/src/main/asciidoc/administration-guide.adoc
@@ -579,7 +579,7 @@ OpenID Connect integration supports the following settings 
in _nifi.properties_.
 by the OpenID Connect Provider according to the specification. If this value 
is `HS256`, `HS384`, or `HS512`, NiFi will attempt to validate HMAC protected 
tokens using the specified client secret.
 If this value is `none`, NiFi will attempt to validate unsecured/plain tokens. 
Other values for this algorithm will attempt to parse as an RSA or EC algorithm 
to be used in conjunction with the
 JSON Web Key (JWK) provided through the jwks_uri in the metadata found at the 
discovery URL
-|`nifi.security.user.oidc.additional.scopes`                | Comma separated 
scopes that are sent to OpenID Connect Provider in addition to `openid` and 
`email`
+|`nifi.security.user.oidc.additional.scopes`                | Comma separated 
scopes that are sent to OpenID Connect Provider in addition to `openid` and 
`email`. Authorization Servers require the `offline_access` scope to return a 
Refresh Token.
 |`nifi.security.user.oidc.claim.identifying.user`           | Claim that 
identifies the authenticated user. The default value is `email`. Claim names 
may need to be requested using the `nifi.security.user.oidc.additional.scopes` 
property
 |`nifi.security.user.oidc.fallback.claims.identifying.user` | Comma-separated 
list of possible fallback claims used to identify the user when the 
`nifi.security.user.oidc.claim.identifying.user` claim is not found.
 |`nifi.security.user.oidc.claim.groups`                     | Name of the ID 
token claim that contains an array of group names of which the
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-resources/pom.xml 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-resources/pom.xml
index 512b88c8bb..87d7ba6183 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-resources/pom.xml
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-resources/pom.xml
@@ -168,7 +168,8 @@
         <nifi.security.user.oidc.client.id />
         <nifi.security.user.oidc.client.secret />
         <nifi.security.user.oidc.preferred.jwsalgorithm />
-        <nifi.security.user.oidc.additional.scopes />
+        <!-- Set additional scopes to support Refresh Token retrieval -->
+        
<nifi.security.user.oidc.additional.scopes>offline_access</nifi.security.user.oidc.additional.scopes>
         <nifi.security.user.oidc.claim.identifying.user />
         <nifi.security.user.oidc.fallback.claims.identifying.user />
         
<nifi.security.user.oidc.claim.groups>groups</nifi.security.user.oidc.claim.groups>
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/oidc/registration/StandardClientRegistrationProvider.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/oidc/registration/StandardClientRegistrationProvider.java
index bc14c4ba81..f2368c3eeb 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/oidc/registration/StandardClientRegistrationProvider.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/oidc/registration/StandardClientRegistrationProvider.java
@@ -21,7 +21,6 @@ import static 
com.nimbusds.oauth2.sdk.auth.ClientAuthenticationMethod.CLIENT_SEC
 import static com.nimbusds.oauth2.sdk.auth.ClientAuthenticationMethod.NONE;
 
 import com.nimbusds.oauth2.sdk.ParseException;
-import com.nimbusds.oauth2.sdk.Scope;
 import com.nimbusds.openid.connect.sdk.op.OIDCProviderMetadata;
 import org.apache.nifi.util.NiFiProperties;
 import org.apache.nifi.web.security.oidc.OidcConfigurationException;
@@ -30,8 +29,11 @@ import 
org.apache.nifi.web.security.oidc.client.web.OidcRegistrationProperty;
 import 
org.springframework.security.oauth2.client.registration.ClientRegistration;
 import org.springframework.security.oauth2.core.AuthorizationGrantType;
 import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
+import org.springframework.security.oauth2.core.oidc.OidcScopes;
 import org.springframework.web.client.RestOperations;
 
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -46,6 +48,8 @@ public class StandardClientRegistrationProvider implements 
ClientRegistrationPro
 
     private static final String REGISTRATION_REDIRECT_URI = 
String.format("{baseUrl}%s", OidcUrlPath.CALLBACK.getPath());
 
+    private static final Set<String> STANDARD_SCOPES = 
Collections.unmodifiableSet(new 
LinkedHashSet<>(Arrays.asList(OidcScopes.OPENID, OidcScopes.EMAIL)));
+
     private final NiFiProperties properties;
 
     private final RestOperations restOperations;
@@ -77,8 +81,7 @@ public class StandardClientRegistrationProvider implements 
ClientRegistrationPro
         final String jwkSetUri = 
providerMetadata.getJWKSetURI().toASCIIString();
         final String userInfoUri = 
providerMetadata.getUserInfoEndpointURI().toASCIIString();
 
-        final Scope metadataScope = providerMetadata.getScopes();
-        final Set<String> scope = new 
LinkedHashSet<>(metadataScope.toStringList());
+        final Set<String> scope = new LinkedHashSet<>(STANDARD_SCOPES);
         final List<String> additionalScopes = 
properties.getOidcAdditionalScopes();
         scope.addAll(additionalScopes);
 
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/oidc/registration/StandardClientRegistrationProviderTest.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/oidc/registration/StandardClientRegistrationProviderTest.java
index 97847926a1..164cd7c58c 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/oidc/registration/StandardClientRegistrationProviderTest.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/oidc/registration/StandardClientRegistrationProviderTest.java
@@ -28,12 +28,16 @@ import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 import 
org.springframework.security.oauth2.client.registration.ClientRegistration;
 import org.springframework.security.oauth2.core.AuthenticationMethod;
+import org.springframework.security.oauth2.core.oidc.OidcScopes;
 import org.springframework.web.client.RestOperations;
 
 import java.net.URI;
+import java.util.Arrays;
 import java.util.Collections;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Properties;
+import java.util.Set;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -61,6 +65,8 @@ class StandardClientRegistrationProviderTest {
 
     private static final String USER_NAME_ATTRIBUTE_NAME = "email";
 
+    private static final Set<String> EXPECTED_SCOPES = new 
LinkedHashSet<>(Arrays.asList(OidcScopes.OPENID, OidcScopes.EMAIL, 
OidcScopes.PROFILE));
+
     private static final String INVALID_CONFIGURATION = "{}";
 
     @Mock
@@ -92,6 +98,9 @@ class StandardClientRegistrationProviderTest {
         assertEquals(USER_INFO_URI.toString(), userInfoEndpoint.getUri());
         assertEquals(USER_NAME_ATTRIBUTE_NAME, 
userInfoEndpoint.getUserNameAttributeName());
         assertEquals(AuthenticationMethod.HEADER, 
userInfoEndpoint.getAuthenticationMethod());
+
+        final Set<String> scopes = clientRegistration.getScopes();
+        assertEquals(EXPECTED_SCOPES, scopes);
     }
 
     @Test
@@ -120,6 +129,7 @@ class StandardClientRegistrationProviderTest {
         properties.put(NiFiProperties.SECURITY_USER_OIDC_CLIENT_ID, CLIENT_ID);
         properties.put(NiFiProperties.SECURITY_USER_OIDC_CLIENT_SECRET, 
CLIENT_SECRET);
         
properties.put(NiFiProperties.SECURITY_USER_OIDC_CLAIM_IDENTIFYING_USER, 
USER_NAME_ATTRIBUTE_NAME);
+        properties.put(NiFiProperties.SECURITY_USER_OIDC_ADDITIONAL_SCOPES, 
OidcScopes.PROFILE);
         return NiFiProperties.createBasicNiFiProperties(null, properties);
     }
 
@@ -131,6 +141,10 @@ class StandardClientRegistrationProviderTest {
         providerMetadata.setUserInfoEndpointURI(USER_INFO_URI);
         
providerMetadata.setAuthorizationEndpointURI(AUTHORIZATION_ENDPOINT_URI);
         final Scope scopes = new Scope();
+        scopes.add(OidcScopes.OPENID);
+        scopes.add(OidcScopes.EMAIL);
+        scopes.add(OidcScopes.PROFILE);
+        scopes.add(OidcScopes.ADDRESS);
         providerMetadata.setScopes(scopes);
         return providerMetadata;
     }

Reply via email to