NIFI-8931 Removed OTP Authentication

- Removed download-token and ui-extension-token REST resources
- Removed getAccessToken functions from JavaScript components

Signed-off-by: Nathan Gough <thenatog@gmail.com>

This closes #5235.
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiWebApiSecurityConfiguration.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiWebApiSecurityConfiguration.java
index c4e6304..359a03f 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiWebApiSecurityConfiguration.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiWebApiSecurityConfiguration.java
@@ -25,15 +25,11 @@
 import org.apache.nifi.web.security.knox.KnoxAuthenticationFilter;
 import org.apache.nifi.web.security.knox.KnoxAuthenticationProvider;
 import org.apache.nifi.web.security.oidc.OIDCEndpoints;
-import org.apache.nifi.web.security.otp.OtpAuthenticationFilter;
-import org.apache.nifi.web.security.otp.OtpAuthenticationProvider;
 import org.apache.nifi.web.security.saml.SAMLEndpoints;
 import org.apache.nifi.web.security.x509.X509AuthenticationFilter;
 import org.apache.nifi.web.security.x509.X509AuthenticationProvider;
 import org.apache.nifi.web.security.x509.X509CertificateExtractor;
 import org.apache.nifi.web.security.x509.X509IdentityProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -63,8 +59,6 @@
 @EnableWebSecurity
 @EnableGlobalMethodSecurity(prePostEnabled = true)
 public class NiFiWebApiSecurityConfiguration extends WebSecurityConfigurerAdapter {
-    private static final Logger logger = LoggerFactory.getLogger(NiFiWebApiSecurityConfiguration.class);
-
     private NiFiProperties properties;
 
     private X509AuthenticationFilter x509AuthenticationFilter;
@@ -76,9 +70,6 @@
     private JwtAuthenticationFilter jwtAuthenticationFilter;
     private JwtAuthenticationProvider jwtAuthenticationProvider;
 
-    private OtpAuthenticationFilter otpAuthenticationFilter;
-    private OtpAuthenticationProvider otpAuthenticationProvider;
-
     private KnoxAuthenticationFilter knoxAuthenticationFilter;
     private KnoxAuthenticationProvider knoxAuthenticationProvider;
 
@@ -89,11 +80,13 @@
         super(true); // disable defaults
     }
 
+    /**
+     * Configure Web Security with ignoring matchers for authentication requests
+     *
+     * @param webSecurity Spring Web Security Configuration
+     */
     @Override
-    public void configure(WebSecurity webSecurity) throws Exception {
-        // ignore the access endpoints for obtaining the access config, the access token
-        // granting, and access status for a given user (note: we are not ignoring the
-        // the /access/download-token and /access/ui-extension-token endpoints
+    public void configure(final WebSecurity webSecurity) {
         webSecurity
                 .ignoring()
                     .antMatchers(
@@ -138,9 +131,6 @@
         // jwt
         http.addFilterBefore(jwtFilterBean(), AnonymousAuthenticationFilter.class);
 
-        // otp
-        http.addFilterBefore(otpFilterBean(), AnonymousAuthenticationFilter.class);
-
         // knox
         http.addFilterBefore(knoxFilterBean(), AnonymousAuthenticationFilter.class);
 
@@ -173,7 +163,6 @@
         auth
                 .authenticationProvider(x509AuthenticationProvider)
                 .authenticationProvider(jwtAuthenticationProvider)
-                .authenticationProvider(otpAuthenticationProvider)
                 .authenticationProvider(knoxAuthenticationProvider)
                 .authenticationProvider(anonymousAuthenticationProvider);
     }
@@ -189,16 +178,6 @@
     }
 
     @Bean
-    public OtpAuthenticationFilter otpFilterBean() throws Exception {
-        if (otpAuthenticationFilter == null) {
-            otpAuthenticationFilter = new OtpAuthenticationFilter();
-            otpAuthenticationFilter.setProperties(properties);
-            otpAuthenticationFilter.setAuthenticationManager(authenticationManager());
-        }
-        return otpAuthenticationFilter;
-    }
-
-    @Bean
     public KnoxAuthenticationFilter knoxFilterBean() throws Exception {
         if (knoxAuthenticationFilter == null) {
             knoxAuthenticationFilter = new KnoxAuthenticationFilter();
@@ -241,11 +220,6 @@
     }
 
     @Autowired
-    public void setOtpAuthenticationProvider(OtpAuthenticationProvider otpAuthenticationProvider) {
-        this.otpAuthenticationProvider = otpAuthenticationProvider;
-    }
-
-    @Autowired
     public void setKnoxAuthenticationProvider(KnoxAuthenticationProvider knoxAuthenticationProvider) {
         this.knoxAuthenticationProvider = knoxAuthenticationProvider;
     }
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/AccessResource.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/AccessResource.java
index 6dd1c26..bc19f3f 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/AccessResource.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/AccessResource.java
@@ -51,10 +51,8 @@
 import org.apache.nifi.web.security.knox.KnoxService;
 import org.apache.nifi.web.security.logout.LogoutRequest;
 import org.apache.nifi.web.security.logout.LogoutRequestManager;
-import org.apache.nifi.web.security.otp.OtpService;
 import org.apache.nifi.web.security.token.LoginAuthenticationToken;
 import org.apache.nifi.web.security.token.NiFiAuthenticationToken;
-import org.apache.nifi.web.security.token.OtpAuthenticationToken;
 import org.apache.nifi.web.security.x509.X509AuthenticationProvider;
 import org.apache.nifi.web.security.x509.X509AuthenticationRequestToken;
 import org.apache.nifi.web.security.x509.X509CertificateExtractor;
@@ -106,7 +104,6 @@
     private LoginIdentityProvider loginIdentityProvider;
     private JwtAuthenticationProvider jwtAuthenticationProvider;
     private JwtService jwtService;
-    private OtpService otpService;
     private KnoxService knoxService;
     private KerberosService kerberosService;
     protected LogoutRequestManager logoutRequestManager;
@@ -311,96 +308,6 @@
     }
 
     /**
-     * Creates a single use access token for downloading FlowFile content.
-     *
-     * @param httpServletRequest the servlet request
-     * @return A token (string)
-     */
-    @POST
-    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
-    @Produces(MediaType.TEXT_PLAIN)
-    @Path("/download-token")
-    @ApiOperation(
-            value = "Creates a single use access token for downloading FlowFile content.",
-            notes = "The token returned is a base64 encoded string. It is valid for a single request up to five minutes from being issued. " +
-                    "It is used as a query parameter name 'access_token'.",
-            response = String.class
-    )
-    @ApiResponses(
-            value = {
-                    @ApiResponse(code = 403, message = "Client is not authorized to make this request."),
-                    @ApiResponse(code = 409, message = "Unable to create the download token because NiFi is not in the appropriate state. " +
-                            "(i.e. may not have any tokens to grant or be configured to support username/password login)"),
-                    @ApiResponse(code = 500, message = "Unable to create download token because an unexpected error occurred.")
-            }
-    )
-    public Response createDownloadToken(@Context HttpServletRequest httpServletRequest) {
-        // only support access tokens when communicating over HTTPS
-        if (!httpServletRequest.isSecure()) {
-            throw new IllegalStateException("Download tokens are only issued over HTTPS.");
-        }
-
-        final NiFiUser user = NiFiUserUtils.getNiFiUser();
-        if (user == null) {
-            throw new AccessDeniedException("No user authenticated in the request.");
-        }
-
-        final OtpAuthenticationToken authenticationToken = new OtpAuthenticationToken(user.getIdentity());
-
-        // generate otp for response
-        final String token = otpService.generateDownloadToken(authenticationToken);
-
-        // build the response
-        final URI uri = URI.create(generateResourceUri("access", "download-token"));
-        return generateCreatedResponse(uri, token).build();
-    }
-
-    /**
-     * Creates a single use access token for accessing a NiFi UI extension.
-     *
-     * @param httpServletRequest the servlet request
-     * @return A token (string)
-     */
-    @POST
-    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
-    @Produces(MediaType.TEXT_PLAIN)
-    @Path("/ui-extension-token")
-    @ApiOperation(
-            value = "Creates a single use access token for accessing a NiFi UI extension.",
-            notes = "The token returned is a base64 encoded string. It is valid for a single request up to five minutes from being issued. " +
-                    "It is used as a query parameter name 'access_token'.",
-            response = String.class
-    )
-    @ApiResponses(
-            value = {
-                    @ApiResponse(code = 403, message = "Client is not authorized to make this request."),
-                    @ApiResponse(code = 409, message = "Unable to create the download token because NiFi is not in the appropriate state. " +
-                            "(i.e. may not have any tokens to grant or be configured to support username/password login)"),
-                    @ApiResponse(code = 500, message = "Unable to create download token because an unexpected error occurred.")
-            }
-    )
-    public Response createUiExtensionToken(@Context HttpServletRequest httpServletRequest) {
-        // only support access tokens when communicating over HTTPS
-        if (!httpServletRequest.isSecure()) {
-            throw new AuthenticationNotSupportedException("UI extension access tokens are only issued over HTTPS.");
-        }
-
-        final NiFiUser user = NiFiUserUtils.getNiFiUser();
-        if (user == null) {
-            throw new AccessDeniedException("No user authenticated in the request.");
-        }
-
-        final OtpAuthenticationToken authenticationToken = new OtpAuthenticationToken(user.getIdentity());
-
-        // generate otp for response
-        final String token = otpService.generateUiExtensionToken(authenticationToken);
-
-        // build the response
-        final URI uri = URI.create(generateResourceUri("access", "ui-extension-token"));
-        return generateCreatedResponse(uri, token).build();
-    }
-
-    /**
      * Creates a token for accessing the REST API via Kerberos ticket exchange / SPNEGO negotiation.
      *
      * @param httpServletRequest the servlet request
@@ -705,10 +612,6 @@
         this.certificateExtractor = certificateExtractor;
     }
 
-    public void setOtpService(OtpService otpService) {
-        this.otpService = otpService;
-    }
-
     public void setKnoxService(KnoxService knoxService) {
         this.knoxService = knoxService;
     }
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/resources/nifi-web-api-context.xml b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/resources/nifi-web-api-context.xml
index 7f678b5..1934239 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/resources/nifi-web-api-context.xml
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/resources/nifi-web-api-context.xml
@@ -583,7 +583,6 @@
         <property name="principalExtractor" ref="principalExtractor"/>
         <property name="jwtAuthenticationProvider" ref="jwtAuthenticationProvider"/>
         <property name="jwtService" ref="jwtService"/>
-        <property name="otpService" ref="otpService"/>
         <property name="kerberosService" ref="kerberosService"/>
         <property name="properties" ref="nifiProperties"/>
         <property name="clusterCoordinator" ref="clusterCoordinator"/>
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-content-viewer/src/main/webapp/WEB-INF/jsp/header.jsp b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-content-viewer/src/main/webapp/WEB-INF/jsp/header.jsp
index 5f5210d..f7dbd66 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-content-viewer/src/main/webapp/WEB-INF/jsp/header.jsp
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-content-viewer/src/main/webapp/WEB-INF/jsp/header.jsp
@@ -107,38 +107,12 @@
 
                         // if the selection has changesd, reload the page
                         if (currentLocation !== option.value) {
-                            // get an access token if necessary
-                            var getAccessToken = $$.Deferred(function (deferred) {
-                                if (nf.Storage.hasItem('jwt')) {
-                                    $$.ajax({
-                                        type: 'POST',
-                                        url: '../nifi-api/access/ui-extension-token'
-                                    }).done(function (token) {
-                                        deferred.resolve(token);
-                                    }).fail(function () {
-                                        $$('#content-viewer-message').text('Unable to generate a token to view the content.');
-                                        $$('#content-viewer-message-dialog').modal('show');
-                                        deferred.reject();
-                                    })
-                                } else {
-                                    deferred.resolve('');
-                                }
-                            }).promise();
+                            var contentParameter = {
+                                mode: option.value
+                            };
 
-                            // reload as appropriate
-                            getAccessToken.done(function (uiExtensionToken) {
-                                var contentParameter = {
-                                    mode: option.value
-                                };
-
-                                // include the download token if applicable
-                                if (typeof uiExtensionToken !== 'undefined' && uiExtensionToken !== null && $$.trim(uiExtensionToken) !== '') {
-                                    contentParameter['access_token'] = uiExtensionToken;
-                                }
-
-                                var url = window.location.origin + window.location.pathname;
-                                window.location.href = url + '?' + $$.param($$.extend(contentParameter, params));
-                            });
+                            var url = window.location.origin + window.location.pathname;
+                            window.location.href = url + '?' + $$.param($$.extend(contentParameter, params));
                         }
                     }
                 });
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/OidcService.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/oidc/OidcService.java
index 5502ab5..4ac2552 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/oidc/OidcService.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/oidc/OidcService.java
@@ -42,7 +42,7 @@
     private Cache<CacheKey, String> jwtLookupForCompletedRequests; // identifier from cookie -> jwt or identity (and generate jwt on retrieval)
 
     /**
-     * Creates a new OtpService with an expiration of 1 minute.
+     * Creates a new OIDC with an expiration of 1 minute.
      *
      * @param identityProvider          The identity provider
      */
@@ -51,7 +51,7 @@
     }
 
     /**
-     * Creates a new OtpService.
+     * Creates a new OIDC Service.
      *
      * @param identityProvider          The identity provider
      * @param duration                  The expiration duration
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/otp/OtpAuthenticationException.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/otp/OtpAuthenticationException.java
deleted file mode 100644
index ee2d573..0000000
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/otp/OtpAuthenticationException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.nifi.web.security.otp;
-
-import org.springframework.security.core.AuthenticationException;
-
-/**
- * Thrown if a one time use token fails authentication.
- */
-public class OtpAuthenticationException extends AuthenticationException {
-
-    public OtpAuthenticationException(String msg) {
-        super(msg);
-    }
-
-    public OtpAuthenticationException(String msg, Throwable t) {
-        super(msg, t);
-    }
-
-}
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/otp/OtpAuthenticationFilter.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/otp/OtpAuthenticationFilter.java
deleted file mode 100644
index c09a4bb..0000000
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/otp/OtpAuthenticationFilter.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.nifi.web.security.otp;
-
-import java.util.regex.Pattern;
-import javax.servlet.http.HttpServletRequest;
-import org.apache.nifi.web.security.NiFiAuthenticationFilter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.core.Authentication;
-
-/**
- * This filter is used to capture one time passwords (OTP) from requests made to download files through the browser.
- * It's required because when we initiate a download in the browser, it must be opened in a new tab. The new tab
- * cannot be initialized with authentication headers, so we must add a token as a query parameter instead. As
- * tokens in URL strings are visible in various places, this must only be used once - hence our OTP.
- */
-public class OtpAuthenticationFilter extends NiFiAuthenticationFilter {
-
-    private static final Logger logger = LoggerFactory.getLogger(OtpAuthenticationFilter.class);
-
-    private static final Pattern PROVENANCE_DOWNLOAD_PATTERN =
-        Pattern.compile("/provenance-events/([0-9]+)/content/((?:input)|(?:output))");
-    private static final Pattern QUEUE_DOWNLOAD_PATTERN =
-        Pattern.compile("/flowfile-queues/([a-f0-9\\-]{36})/flowfiles/([a-f0-9\\-]{36})/content");
-    private static final Pattern TEMPLATE_DOWNLOAD_PATTERN =
-        Pattern.compile("/templates/[a-f0-9\\-]{36}/download");
-    private static final Pattern FLOW_DOWNLOAD_PATTERN =
-        Pattern.compile("/process-groups/[a-f0-9\\-]{36}/download");
-
-    protected static final String ACCESS_TOKEN = "access_token";
-
-    @Override
-    public Authentication attemptAuthentication(final HttpServletRequest request) {
-        // only support otp login when running securely
-        if (!request.isSecure()) {
-            return null;
-        }
-
-        // get the accessToken out of the query string
-        final String accessToken = request.getParameter(ACCESS_TOKEN);
-
-        // if there is no authorization header, we don't know the user
-        if (accessToken == null) {
-            return null;
-        } else {
-            if (request.getContextPath().equals("/nifi-api")) {
-                if (isDownloadRequest(request.getPathInfo())) {
-                    // handle download requests
-                    return new OtpAuthenticationRequestToken(accessToken, true, request.getRemoteAddr());
-                }
-            } else {
-                // handle requests to other context paths (other UI extensions)
-                return new OtpAuthenticationRequestToken(accessToken, false, request.getRemoteAddr());
-            }
-
-            // the path is a support path for otp tokens
-            return null;
-        }
-    }
-
-    private boolean isDownloadRequest(final String pathInfo) {
-        return PROVENANCE_DOWNLOAD_PATTERN.matcher(pathInfo).matches() || QUEUE_DOWNLOAD_PATTERN.matcher(pathInfo).matches()
-                || TEMPLATE_DOWNLOAD_PATTERN.matcher(pathInfo).matches() || FLOW_DOWNLOAD_PATTERN.matcher(pathInfo).matches();
-    }
-
-}
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/otp/OtpAuthenticationProvider.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/otp/OtpAuthenticationProvider.java
deleted file mode 100644
index 0b89b4b..0000000
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/otp/OtpAuthenticationProvider.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.nifi.web.security.otp;
-
-import org.apache.nifi.admin.service.IdpUserGroupService;
-import org.apache.nifi.authorization.Authorizer;
-import org.apache.nifi.authorization.user.NiFiUser;
-import org.apache.nifi.authorization.user.NiFiUserDetails;
-import org.apache.nifi.authorization.user.StandardNiFiUser.Builder;
-import org.apache.nifi.util.NiFiProperties;
-import org.apache.nifi.web.security.InvalidAuthenticationException;
-import org.apache.nifi.web.security.NiFiAuthenticationProvider;
-import org.apache.nifi.web.security.token.NiFiAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.AuthenticationException;
-
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * This provider will be used when the request is attempting to authenticate with a download or ui extension OTP/token.
- */
-public class OtpAuthenticationProvider extends NiFiAuthenticationProvider {
-
-    private OtpService otpService;
-    private final IdpUserGroupService idpUserGroupService;
-
-    public OtpAuthenticationProvider(OtpService otpService, NiFiProperties nifiProperties, Authorizer authorizer, IdpUserGroupService idpUserGroupService) {
-        super(nifiProperties, authorizer);
-        this.otpService = otpService;
-        this.idpUserGroupService = idpUserGroupService;
-    }
-
-    @Override
-    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
-        final OtpAuthenticationRequestToken request = (OtpAuthenticationRequestToken) authentication;
-
-        try {
-            final String otpPrincipal;
-            if (request.isDownloadToken()) {
-                otpPrincipal = otpService.getAuthenticationFromDownloadToken(request.getToken());
-            } else {
-                otpPrincipal = otpService.getAuthenticationFromUiExtensionToken(request.getToken());
-            }
-            final String mappedIdentity = mapIdentity(otpPrincipal);
-            final Set<String> userGroupProviderGroups = getUserGroups(mappedIdentity);
-            final Set<String> idpUserGroups = getIdpUserGroups(mappedIdentity);
-
-            final NiFiUser user = new Builder()
-                    .identity(mappedIdentity)
-                    .groups(userGroupProviderGroups)
-                    .identityProviderGroups(idpUserGroups)
-                    .clientAddress(request.getClientAddress())
-                    .build();
-
-            return new NiFiAuthenticationToken(new NiFiUserDetails(user));
-        } catch (OtpAuthenticationException e) {
-            throw new InvalidAuthenticationException(e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public boolean supports(Class<?> authentication) {
-        return OtpAuthenticationRequestToken.class.isAssignableFrom(authentication);
-    }
-
-    private Set<String> getIdpUserGroups(final String mappedIdentity) {
-        return idpUserGroupService.getUserGroups(mappedIdentity).stream()
-                .map(ug -> ug.getGroupName())
-                .collect(Collectors.toSet());
-    }
-
-}
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/otp/OtpAuthenticationRequestToken.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/otp/OtpAuthenticationRequestToken.java
deleted file mode 100644
index bad7c94..0000000
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/otp/OtpAuthenticationRequestToken.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.nifi.web.security.otp;
-
-import org.apache.nifi.web.security.NiFiAuthenticationRequestToken;
-
-/**
- * This is an authentication request with a given OTP token.
- */
-public class OtpAuthenticationRequestToken extends NiFiAuthenticationRequestToken {
-
-    private final String token;
-    private final boolean isDownloadToken;
-
-    /**
-     * Creates a representation of the otp authentication request for a user.
-     *
-     * @param token   The unique token for this user
-     * @param isDownloadToken Whether or not this represents a download token
-     * @param clientAddress the address of the client making the request
-     */
-    public OtpAuthenticationRequestToken(final String token, final boolean isDownloadToken, final String clientAddress) {
-        super(clientAddress);
-        setAuthenticated(false);
-        this.token = token;
-        this.isDownloadToken = isDownloadToken;
-    }
-
-    @Override
-    public Object getCredentials() {
-        return null;
-    }
-
-    @Override
-    public Object getPrincipal() {
-        return token;
-    }
-
-    public String getToken() {
-        return token;
-    }
-
-    public boolean isDownloadToken() {
-        return isDownloadToken;
-    }
-
-    @Override
-    public String toString() {
-        return "<OTP token>";
-    }
-
-}
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/otp/OtpService.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/otp/OtpService.java
deleted file mode 100644
index e8d96ae..0000000
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/otp/OtpService.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.nifi.web.security.otp;
-
-import java.nio.charset.StandardCharsets;
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.util.concurrent.TimeUnit;
-import javax.crypto.Mac;
-import javax.crypto.spec.SecretKeySpec;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.nifi.web.security.token.OtpAuthenticationToken;
-import org.apache.nifi.web.security.util.CacheKey;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * OtpService is a service for generating and verifying one time password tokens.
- */
-public class OtpService {
-
-    private static final Logger logger = LoggerFactory.getLogger(OtpService.class);
-
-    private static final String HMAC_SHA256 = "HmacSHA256";
-
-    // protected for testing purposes
-    protected static final int MAX_CACHE_SOFT_LIMIT = 100;
-
-    private final TokenCache downloadTokens;
-    private final TokenCache uiExtensionTokens;
-
-    /**
-     * Creates a new OtpService with an expiration of 5 minutes.
-     */
-    public OtpService() {
-        this(5, TimeUnit.MINUTES);
-    }
-
-    /**
-     * Creates a new OtpService.
-     *
-     * @param duration                  The expiration duration
-     * @param units                     The expiration units
-     * @throws NullPointerException     If units is null
-     * @throws IllegalArgumentException If duration is negative
-     */
-    public OtpService(final int duration, final TimeUnit units) {
-        downloadTokens = new TokenCache("download tokens", duration, units);
-        uiExtensionTokens = new TokenCache("UI extension tokens", duration, units);
-    }
-
-    /**
-     * Generates a download token for the specified authentication.
-     *
-     * @param authenticationToken       The authentication
-     * @return                          The one time use download token
-     */
-    public String generateDownloadToken(final OtpAuthenticationToken authenticationToken) {
-        return generateToken(downloadTokens, authenticationToken);
-    }
-
-    /**
-     * Gets the authenticated identity from the specified one time use download token. This method will not return null.
-     *
-     * @param token                     The one time use download token
-     * @return                          The authenticated identity
-     * @throws OtpAuthenticationException   When the specified token does not correspond to an authenticated identity
-     */
-    public String getAuthenticationFromDownloadToken(final String token) throws OtpAuthenticationException {
-        return getAuthenticationFromToken(downloadTokens, token);
-    }
-
-    /**
-     * Generates a UI extension token for the specified authentication.
-     *
-     * @param authenticationToken       The authentication
-     * @return                          The one time use UI extension token
-     */
-    public String generateUiExtensionToken(final OtpAuthenticationToken authenticationToken) {
-        return generateToken(uiExtensionTokens, authenticationToken);
-    }
-
-    /**
-     * Gets the authenticated identity from the specified one time use UI extension token. This method will not return null.
-     *
-     * @param token                     The one time use UI extension token
-     * @return                          The authenticated identity
-     * @throws OtpAuthenticationException   When the specified token does not correspond to an authenticated identity
-     */
-    public String getAuthenticationFromUiExtensionToken(final String token) throws OtpAuthenticationException {
-        return getAuthenticationFromToken(uiExtensionTokens, token);
-    }
-
-    /**
-     * Generates a token and stores it in the specified cache.
-     *
-     * @param tokenCache                A cache that maps tokens to users
-     * @param authenticationToken       The authentication
-     * @return                          The one time use token
-     */
-    private String generateToken(final TokenCache tokenCache, final OtpAuthenticationToken authenticationToken) {
-        final String userId = (String) authenticationToken.getPrincipal();
-
-        // If the user has a token already, return it
-        if(tokenCache.containsValue(userId)) {
-            return (tokenCache.getKeyForValue(userId)).getKey();
-        } else {
-            // Otherwise, generate a token
-            if (tokenCache.size() >= MAX_CACHE_SOFT_LIMIT) {
-                throw new IllegalStateException("The maximum number of single use tokens have been issued.");
-            }
-
-            // Hash the authentication and build a cache key
-            final CacheKey cacheKey = new CacheKey(hash(authenticationToken));
-
-            // Store the token and user in the cache
-            tokenCache.put(cacheKey, userId);
-
-            // Return the token
-            return cacheKey.getKey();
-        }
-    }
-
-    /**
-     * Gets the corresponding authentication for the specified one time use token. The specified token will be removed
-     * from the token cache.
-     *
-     * @param tokenCache                A cache that maps tokens to users
-     * @param token                     The one time use token
-     * @return                          The authenticated identity
-     */
-    private String getAuthenticationFromToken(final TokenCache tokenCache, final String token) throws OtpAuthenticationException {
-        final CacheKey cacheKey = new CacheKey(token);
-        final String authenticatedUser = (String) tokenCache.getIfPresent(cacheKey);
-
-        if (authenticatedUser == null) {
-            throw new OtpAuthenticationException("Unable to validate the access token.");
-        } else {
-            tokenCache.invalidate(cacheKey);
-        }
-
-        return authenticatedUser;
-    }
-
-    /**
-     * Hashes the specified authentication token. The resulting value will be used as the one time use token.
-     *
-     * @param authenticationToken   the authentication token
-     * @return                      the one time use token
-     */
-    private String hash(final OtpAuthenticationToken authenticationToken) {
-        try {
-            // input is the user identity and timestamp
-            final String input = authenticationToken.getName() + "-" + System.nanoTime();
-
-            // create the secret using secure random
-            final SecureRandom secureRandom = new SecureRandom();
-            final byte[] randomBytes = new byte[32];
-            secureRandom.nextBytes(randomBytes);
-            final SecretKeySpec secret = new SecretKeySpec(randomBytes, HMAC_SHA256); // 256 bit
-
-            // hash the input
-            final Mac hmacSha256 = Mac.getInstance(HMAC_SHA256);
-            hmacSha256.init(secret);
-            final byte[] output = hmacSha256.doFinal(input.getBytes(StandardCharsets.UTF_8));
-
-            // return the result as a base 64 string
-            return Base64.encodeBase64URLSafeString(output);
-        } catch (final NoSuchAlgorithmException | InvalidKeyException e) {
-            final String errorMessage = "There was an error generating the OTP";
-            logger.error(errorMessage, e);
-            throw new IllegalStateException("Unable to generate single use token.");
-        }
-    }
-}
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/otp/TokenCache.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/otp/TokenCache.java
deleted file mode 100644
index a19efe2..0000000
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/otp/TokenCache.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.nifi.web.security.otp;
-
-import com.google.common.cache.AbstractCache;
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheStats;
-import java.util.Map;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.TimeUnit;
-import org.apache.nifi.web.security.util.CacheKey;
-import org.checkerframework.checker.nullness.qual.Nullable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * This class provides a specific wrapper implementation based on the Guava {@link Cache} but with
- * reverse-index capability because of the special use case (a user [the cache value] can only have
- * one active token [the cache key] at a time). This allows reverse lookup semantics.
- */
-public class TokenCache extends AbstractCache<CacheKey, String> {
-    private static final Logger logger = LoggerFactory.getLogger(TokenCache.class);
-
-    private final String contentsDescription;
-    private final Cache<CacheKey, String> internalCache;
-
-    public TokenCache(String contentsDescription, final int duration, final TimeUnit units) {
-        this.contentsDescription = contentsDescription;
-        internalCache = CacheBuilder.newBuilder().expireAfterWrite(duration, units).build();
-    }
-
-    /**
-     * Returns the value associated with {@code key} in this cache, or {@code null} if there is no
-     * cached value for {@code key}.
-     *
-     * @param key the (wrapped) {@code token}
-     * @since 11.0
-     * @return the retrieved value ({@code user})
-     */
-    @Override
-    public @Nullable String getIfPresent(Object key) {
-        return internalCache.getIfPresent(key);
-    }
-
-    /**
-     * Puts the provided value ({@code user}) in the cache at the provided key (wrapped {@code token}).
-     *
-     * @param key the cache key
-     * @param value the value to insert
-     * @since 11.0
-     */
-    @Override
-    public void put(CacheKey key, String value) {
-            internalCache.put(key, value);
-    }
-
-    /**
-     * Returns {@code true} if the cache contains the provided value.
-     *
-     * @param value the value ({@code user}) to look for
-     * @return true if the user exists in the cache
-     */
-    public boolean containsValue(String value) {
-        return internalCache.asMap().containsValue(value);
-    }
-
-    /**
-     * Returns the {@link CacheKey} representing the key ({@code token}) associated with the provided value ({@code user}).
-     *
-     * @param value the value ({@code user}) to look for
-     * @return the CacheKey ({@code token}) associated with this user, or {@code null} if the user has no tokens in this cache
-     */
-    @Nullable
-    public CacheKey getKeyForValue(String value) {
-        if (containsValue(value)) {
-            Map<CacheKey, String> cacheMap = internalCache.asMap();
-            for (Map.Entry<CacheKey, String> e : cacheMap.entrySet()) {
-                if (e.getValue().equals(value)) {
-                    return e.getKey();
-                }
-            }
-            throw new IllegalStateException("The value existed in the cache but expired during retrieval");
-        } else {
-            return null;
-        }
-    }
-
-    // Override the unsupported abstract methods from the parent
-
-    @Override
-    public void invalidate(Object key) {
-        internalCache.invalidate(key);
-    }
-
-    @Override
-    public void invalidateAll() {
-        internalCache.invalidateAll(internalCache.asMap().keySet());
-    }
-
-    @Override
-    public long size() {
-        return internalCache.size();
-    }
-
-    @Override
-    public CacheStats stats() {
-        return internalCache.stats();
-    }
-
-    @Override
-    public ConcurrentMap<CacheKey, String> asMap() {
-        return internalCache.asMap();
-    }
-
-    /**
-     * Returns a string representation of the cache.
-     *
-     * @return a string representation of the cache
-     */
-    @Override
-    public String toString() {
-        return new StringBuilder("TokenCache for ")
-                .append(contentsDescription)
-                .append(" with ")
-                .append(internalCache.size())
-                .append(" elements")
-                .toString();
-    }
-}
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/token/OtpAuthenticationToken.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/token/OtpAuthenticationToken.java
deleted file mode 100644
index fc51912..0000000
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/token/OtpAuthenticationToken.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.nifi.web.security.token;
-
-import org.springframework.security.authentication.AbstractAuthenticationToken;
-
-/**
- * This is an Authentication Token for logging in. Once a user is authenticated, they can be issued an ID token.
- */
-public class OtpAuthenticationToken extends AbstractAuthenticationToken {
-
-    private final String identity;
-
-    /**
-     * Creates a representation of the otp authentication token for a user.
-     *
-     * @param identity   The unique identifier for this user
-     */
-    public OtpAuthenticationToken(final String identity) {
-        super(null);
-        setAuthenticated(true);
-        this.identity = identity;
-    }
-
-    @Override
-    public Object getCredentials() {
-        return null;
-    }
-
-    @Override
-    public Object getPrincipal() {
-        return identity;
-    }
-
-    @Override
-    public String toString() {
-        return new StringBuilder("OtpAuthenticationToken for ")
-                .append(getName())
-                .toString();
-    }
-
-}
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/resources/nifi-web-security-context.xml b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/resources/nifi-web-security-context.xml
index 0405dc5..fe9d59f 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/resources/nifi-web-security-context.xml
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/resources/nifi-web-security-context.xml
@@ -39,7 +39,7 @@
         <property name="certificateValidator" ref="certificateValidator"/>
     </bean>
 
-    <!-- otp authentication provider -->
+    <!-- x509 authentication provider -->
     <bean id="x509AuthenticationProvider" class="org.apache.nifi.web.security.x509.X509AuthenticationProvider">
         <constructor-arg ref="certificateIdentityProvider" index="0"/>
         <constructor-arg ref="authorizer" index="1"/>
@@ -59,17 +59,6 @@
         <constructor-arg ref="idpUserGroupService" index="3"/>
     </bean>
 
-    <!-- otp service -->
-    <bean id="otpService" class="org.apache.nifi.web.security.otp.OtpService"/>
-
-    <!-- otp authentication provider -->
-    <bean id="otpAuthenticationProvider" class="org.apache.nifi.web.security.otp.OtpAuthenticationProvider">
-        <constructor-arg ref="otpService" index="0"/>
-        <constructor-arg ref="nifiProperties" index="1"/>
-        <constructor-arg ref="authorizer" index="2"/>
-        <constructor-arg ref="idpUserGroupService" index="3"/>
-    </bean>
-
     <!-- knox service -->
     <bean id="knoxService" class="org.apache.nifi.web.security.knox.KnoxServiceFactoryBean">
         <property name="properties" ref="nifiProperties"/>
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/groovy/org/apache/nifi/web/security/otp/TokenCacheTest.groovy b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/groovy/org/apache/nifi/web/security/otp/TokenCacheTest.groovy
deleted file mode 100644
index 64f8b6e..0000000
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/groovy/org/apache/nifi/web/security/otp/TokenCacheTest.groovy
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.nifi.web.security.otp
-
-
-import org.apache.nifi.web.security.token.OtpAuthenticationToken
-import org.apache.nifi.web.security.util.CacheKey
-import org.bouncycastle.jce.provider.BouncyCastleProvider
-import org.junit.After
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
-
-import java.security.Security
-import java.util.concurrent.TimeUnit
-
-@RunWith(JUnit4.class)
-class TokenCacheTest extends GroovyTestCase {
-    private static final Logger logger = LoggerFactory.getLogger(TokenCache.class)
-
-    private static final String andy = "alopresto"
-    private static final String nathan = "ngough"
-    private static final String matt = "mgilman"
-
-    private static final int LONG_CACHE_EXPIRATION = 10
-    private static final int SHORT_CACHE_EXPIRATION = 1
-
-    @BeforeClass
-    static void setUpOnce() throws Exception {
-        Security.addProvider(new BouncyCastleProvider())
-
-        logger.metaClass.methodMissing = { String name, args ->
-            logger.info("[${name?.toUpperCase()}] ${(args as List).join(" ")}")
-        }
-    }
-
-    @Before
-    void setUp() throws Exception {
-
-    }
-
-    @After
-    void tearDown() throws Exception {
-
-    }
-
-    /**
-     * Returns a simple "hash" of the provided principal (for test purposes, simply reverses the String).
-     *
-     * @param principal the token principal
-     * @return the hashed token output
-     */
-    private static String hash(def principal) {
-        principal.toString().reverse()
-    }
-
-    /**
-     * Returns the {@link CacheKey} constructed from the provided token.
-     *
-     * @param token the authentication token
-     * @return the cache key
-     */
-    private static CacheKey buildCacheKey(OtpAuthenticationToken token) {
-        new CacheKey(hash(token.principal))
-    }
-
-    @Test
-    void testShouldCheckIfContainsValue() throws Exception {
-        // Arrange
-        TokenCache tokenCache = new TokenCache("test tokens", LONG_CACHE_EXPIRATION, TimeUnit.SECONDS)
-
-        OtpAuthenticationToken andyToken = new OtpAuthenticationToken(andy)
-        OtpAuthenticationToken nathanToken = new OtpAuthenticationToken(nathan)
-
-        tokenCache.put(buildCacheKey(andyToken), andy)
-        tokenCache.put(buildCacheKey(nathanToken), nathan)
-
-        logger.info(tokenCache.toString())
-
-        // Act
-        boolean containsAndyToken = tokenCache.containsValue(andy)
-        boolean containsNathanToken = tokenCache.containsValue(nathan)
-        boolean containsMattToken = tokenCache.containsValue(matt)
-
-        // Assert
-        assert containsAndyToken
-        assert containsNathanToken
-        assert !containsMattToken
-    }
-
-    @Test
-    void testShouldGetKeyByValue() throws Exception {
-        // Arrange
-        TokenCache tokenCache = new TokenCache("test tokens", LONG_CACHE_EXPIRATION, TimeUnit.SECONDS)
-
-        OtpAuthenticationToken andyToken = new OtpAuthenticationToken(andy)
-        OtpAuthenticationToken nathanToken = new OtpAuthenticationToken(nathan)
-
-        tokenCache.put(buildCacheKey(andyToken), andy)
-        tokenCache.put(buildCacheKey(nathanToken), nathan)
-
-        logger.info(tokenCache.toString())
-
-        // Act
-        CacheKey keyForAndyToken = tokenCache.getKeyForValue(andy)
-        CacheKey keyForNathanToken = tokenCache.getKeyForValue(nathan)
-        CacheKey keyForMattToken = tokenCache.getKeyForValue(matt)
-
-        def tokens = [keyForAndyToken, keyForNathanToken, keyForMattToken]
-        logger.info("Retrieved tokens: ${tokens}")
-
-        // Assert
-        assert keyForAndyToken.getKey() == hash(andyToken.principal)
-        assert keyForNathanToken.getKey() == hash(nathanToken.principal)
-        assert !keyForMattToken
-    }
-
-    @Test
-    void testShouldNotGetKeyByValueAfterExpiration() throws Exception {
-        // Arrange
-        TokenCache tokenCache = new TokenCache("test tokens", SHORT_CACHE_EXPIRATION, TimeUnit.SECONDS)
-
-        OtpAuthenticationToken andyToken = new OtpAuthenticationToken(andy)
-        OtpAuthenticationToken nathanToken = new OtpAuthenticationToken(nathan)
-
-        tokenCache.put(buildCacheKey(andyToken), andy)
-        tokenCache.put(buildCacheKey(nathanToken), nathan)
-
-        logger.info(tokenCache.toString())
-
-        // Sleep to allow the cache entries to expire (was failing on Windows JDK 8 when only sleeping for 1 second)
-        sleep(SHORT_CACHE_EXPIRATION * 2 * 1000)
-
-        // Act
-        CacheKey keyForAndyToken = tokenCache.getKeyForValue(andy)
-        CacheKey keyForNathanToken = tokenCache.getKeyForValue(nathan)
-        CacheKey keyForMattToken = tokenCache.getKeyForValue(matt)
-
-        def tokens = [keyForAndyToken, keyForNathanToken, keyForMattToken]
-        logger.info("Retrieved tokens: ${tokens}")
-
-        // Assert
-        assert !keyForAndyToken
-        assert !keyForNathanToken
-        assert !keyForMattToken
-    }
-
-    @Test
-    void testShouldInvalidateSingleKey() throws Exception {
-        // Arrange
-        TokenCache tokenCache = new TokenCache("test tokens", LONG_CACHE_EXPIRATION, TimeUnit.SECONDS)
-
-        OtpAuthenticationToken andyToken = new OtpAuthenticationToken(andy)
-        OtpAuthenticationToken nathanToken = new OtpAuthenticationToken(nathan)
-        OtpAuthenticationToken mattToken = new OtpAuthenticationToken(matt)
-
-        CacheKey andyKey = buildCacheKey(andyToken)
-        CacheKey nathanKey = buildCacheKey(nathanToken)
-        CacheKey mattKey = buildCacheKey(mattToken)
-
-        tokenCache.put(andyKey, andy)
-        tokenCache.put(nathanKey, nathan)
-        tokenCache.put(mattKey, matt)
-
-        logger.info(tokenCache.toString())
-
-        // Act
-        tokenCache.invalidate(andyKey)
-
-        // Assert
-        assert !tokenCache.containsValue(andy)
-        assert tokenCache.containsValue(nathan)
-        assert tokenCache.containsValue(matt)
-    }
-
-    @Test
-    void testShouldInvalidateMultipleKeys() throws Exception {
-        // Arrange
-        TokenCache tokenCache = new TokenCache("test tokens", LONG_CACHE_EXPIRATION, TimeUnit.SECONDS)
-
-        OtpAuthenticationToken andyToken = new OtpAuthenticationToken(andy)
-        OtpAuthenticationToken nathanToken = new OtpAuthenticationToken(nathan)
-        OtpAuthenticationToken mattToken = new OtpAuthenticationToken(matt)
-
-        CacheKey andyKey = buildCacheKey(andyToken)
-        CacheKey nathanKey = buildCacheKey(nathanToken)
-        CacheKey mattKey = buildCacheKey(mattToken)
-
-        tokenCache.put(andyKey, andy)
-        tokenCache.put(nathanKey, nathan)
-        tokenCache.put(mattKey, matt)
-
-        logger.info(tokenCache.toString())
-
-        // Act
-        tokenCache.invalidateAll([andyKey, nathanKey])
-
-        // Assert
-        assert !tokenCache.containsValue(andy)
-        assert !tokenCache.containsValue(nathan)
-        assert tokenCache.containsValue(matt)
-    }
-
-    @Test
-    void testShouldInvalidateAll() throws Exception {
-        // Arrange
-        TokenCache tokenCache = new TokenCache("test tokens", LONG_CACHE_EXPIRATION, TimeUnit.SECONDS)
-
-        OtpAuthenticationToken andyToken = new OtpAuthenticationToken(andy)
-        OtpAuthenticationToken nathanToken = new OtpAuthenticationToken(nathan)
-        OtpAuthenticationToken mattToken = new OtpAuthenticationToken(matt)
-
-        CacheKey andyKey = buildCacheKey(andyToken)
-        CacheKey nathanKey = buildCacheKey(nathanToken)
-        CacheKey mattKey = buildCacheKey(mattToken)
-
-        tokenCache.put(andyKey, andy)
-        tokenCache.put(nathanKey, nathan)
-        tokenCache.put(mattKey, matt)
-
-        logger.info(tokenCache.toString())
-
-        // Act
-        tokenCache.invalidateAll()
-
-        // Assert
-        assert !tokenCache.containsValue(andy)
-        assert !tokenCache.containsValue(nathan)
-        assert !tokenCache.containsValue(matt)
-    }
-}
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/otp/OtpAuthenticationFilterTest.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/otp/OtpAuthenticationFilterTest.java
deleted file mode 100644
index 8027b8f..0000000
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/otp/OtpAuthenticationFilterTest.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.nifi.web.security.otp;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.UUID;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class OtpAuthenticationFilterTest {
-
-    private final static String UI_EXTENSION_AUTHENTICATED_USER = "ui-extension-token-authenticated-user";
-    private final static String UI_EXTENSION_TOKEN = "ui-extension-token";
-
-    private final static String DOWNLOAD_AUTHENTICATED_USER = "download-token-authenticated-user";
-    private final static String DOWNLOAD_TOKEN = "download-token";
-
-    private OtpAuthenticationFilter otpAuthenticationFilter;
-
-    @Before
-    public void setUp() throws Exception {
-        otpAuthenticationFilter = new OtpAuthenticationFilter();
-    }
-
-    @Test
-    public void testInsecureHttp() throws Exception {
-        final HttpServletRequest request = mock(HttpServletRequest.class);
-        when(request.isSecure()).thenReturn(false);
-        assertNull(otpAuthenticationFilter.attemptAuthentication(request));
-    }
-
-    @Test
-    public void testNoAccessToken() throws Exception {
-        final HttpServletRequest request = mock(HttpServletRequest.class);
-        when(request.isSecure()).thenReturn(true);
-        when(request.getParameter(OtpAuthenticationFilter.ACCESS_TOKEN)).thenReturn(null);
-        assertNull(otpAuthenticationFilter.attemptAuthentication(request));
-    }
-
-    @Test
-    public void testUnsupportedDownloadPath() throws Exception {
-        final HttpServletRequest request = mock(HttpServletRequest.class);
-        when(request.isSecure()).thenReturn(true);
-        when(request.getParameter(OtpAuthenticationFilter.ACCESS_TOKEN)).thenReturn("my-access-token");
-        when(request.getContextPath()).thenReturn("/nifi-api");
-        when(request.getPathInfo()).thenReturn("/flow/cluster/summary");
-
-        assertNull(otpAuthenticationFilter.attemptAuthentication(request));
-    }
-
-    @Test
-    public void testUiExtensionPath() throws Exception {
-        final HttpServletRequest request = mock(HttpServletRequest.class);
-        when(request.isSecure()).thenReturn(true);
-        when(request.getParameter(OtpAuthenticationFilter.ACCESS_TOKEN)).thenReturn(UI_EXTENSION_TOKEN);
-        when(request.getContextPath()).thenReturn("/nifi-update-attribute-ui");
-
-        final OtpAuthenticationRequestToken result = (OtpAuthenticationRequestToken) otpAuthenticationFilter.attemptAuthentication(request);
-        assertEquals(UI_EXTENSION_TOKEN, result.getToken());
-        assertFalse(result.isDownloadToken());
-    }
-
-    @Test
-    public void testProvenanceInputContentDownload() throws Exception {
-        final HttpServletRequest request = mock(HttpServletRequest.class);
-        when(request.isSecure()).thenReturn(true);
-        when(request.getParameter(OtpAuthenticationFilter.ACCESS_TOKEN)).thenReturn(DOWNLOAD_TOKEN);
-        when(request.getContextPath()).thenReturn("/nifi-api");
-        when(request.getPathInfo()).thenReturn("/provenance-events/0/content/input");
-
-        final OtpAuthenticationRequestToken result = (OtpAuthenticationRequestToken) otpAuthenticationFilter.attemptAuthentication(request);
-        assertEquals(DOWNLOAD_TOKEN, result.getToken());
-        assertTrue(result.isDownloadToken());
-    }
-
-    @Test
-    public void testProvenanceOutputContentDownload() throws Exception {
-        final HttpServletRequest request = mock(HttpServletRequest.class);
-        when(request.isSecure()).thenReturn(true);
-        when(request.getParameter(OtpAuthenticationFilter.ACCESS_TOKEN)).thenReturn(DOWNLOAD_TOKEN);
-        when(request.getContextPath()).thenReturn("/nifi-api");
-        when(request.getPathInfo()).thenReturn("/provenance-events/0/content/output");
-
-        final OtpAuthenticationRequestToken result = (OtpAuthenticationRequestToken) otpAuthenticationFilter.attemptAuthentication(request);
-        assertEquals(DOWNLOAD_TOKEN, result.getToken());
-        assertTrue(result.isDownloadToken());
-    }
-
-    @Test
-    public void testFlowFileContentDownload() throws Exception {
-        final String uuid = UUID.randomUUID().toString();
-
-        final HttpServletRequest request = mock(HttpServletRequest.class);
-        when(request.isSecure()).thenReturn(true);
-        when(request.getParameter(OtpAuthenticationFilter.ACCESS_TOKEN)).thenReturn(DOWNLOAD_TOKEN);
-        when(request.getContextPath()).thenReturn("/nifi-api");
-        when(request.getPathInfo()).thenReturn(String.format("/flowfile-queues/%s/flowfiles/%s/content", uuid, uuid));
-
-        final OtpAuthenticationRequestToken result = (OtpAuthenticationRequestToken) otpAuthenticationFilter.attemptAuthentication(request);
-        assertEquals(DOWNLOAD_TOKEN, result.getToken());
-        assertTrue(result.isDownloadToken());
-    }
-
-    @Test
-    public void testTemplateDownload() throws Exception {
-        final String uuid = UUID.randomUUID().toString();
-
-        final HttpServletRequest request = mock(HttpServletRequest.class);
-        when(request.isSecure()).thenReturn(true);
-        when(request.getParameter(OtpAuthenticationFilter.ACCESS_TOKEN)).thenReturn(DOWNLOAD_TOKEN);
-        when(request.getContextPath()).thenReturn("/nifi-api");
-        when(request.getPathInfo()).thenReturn(String.format("/templates/%s/download", uuid));
-
-        final OtpAuthenticationRequestToken result = (OtpAuthenticationRequestToken) otpAuthenticationFilter.attemptAuthentication(request);
-        assertEquals(DOWNLOAD_TOKEN, result.getToken());
-        assertTrue(result.isDownloadToken());
-    }
-
-}
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/otp/OtpAuthenticationProviderTest.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/otp/OtpAuthenticationProviderTest.java
deleted file mode 100644
index 38c95a6..0000000
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/otp/OtpAuthenticationProviderTest.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.nifi.web.security.otp;
-
-import org.apache.nifi.admin.service.IdpUserGroupService;
-import org.apache.nifi.authorization.AccessPolicyProvider;
-import org.apache.nifi.authorization.Authorizer;
-import org.apache.nifi.authorization.Group;
-import org.apache.nifi.authorization.ManagedAuthorizer;
-import org.apache.nifi.authorization.User;
-import org.apache.nifi.authorization.UserAndGroups;
-import org.apache.nifi.authorization.UserGroupProvider;
-import org.apache.nifi.authorization.user.NiFiUser;
-import org.apache.nifi.authorization.user.NiFiUserDetails;
-import org.apache.nifi.idp.IdpType;
-import org.apache.nifi.idp.IdpUserGroup;
-import org.apache.nifi.util.NiFiProperties;
-import org.apache.nifi.web.security.token.NiFiAuthenticationToken;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Set;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-public class OtpAuthenticationProviderTest {
-
-    private final static String UI_EXTENSION_AUTHENTICATED_USER = "ui-extension-token-authenticated-user";
-    private final static String UI_EXTENSION_TOKEN = "ui-extension-token";
-
-    private final static String DOWNLOAD_AUTHENTICATED_USER = "download-token-authenticated-user";
-    private final static String DOWNLOAD_TOKEN = "download-token";
-
-    private OtpService otpService;
-    private OtpAuthenticationProvider otpAuthenticationProvider;
-    private NiFiProperties nifiProperties;
-    private IdpUserGroupService idpUserGroupService;
-
-    @Before
-    public void setUp() throws Exception {
-        otpService = mock(OtpService.class);
-        doAnswer(new Answer<String>() {
-            @Override
-            public String answer(InvocationOnMock invocation) throws Throwable {
-                Object[] args = invocation.getArguments();
-                String downloadToken = (String) args[0];
-
-                if (DOWNLOAD_TOKEN.equals(downloadToken)) {
-                    return DOWNLOAD_AUTHENTICATED_USER;
-                }
-
-                throw new OtpAuthenticationException("Invalid token");
-            }
-        }).when(otpService).getAuthenticationFromDownloadToken(anyString());
-        doAnswer(new Answer<String>() {
-            @Override
-            public String answer(InvocationOnMock invocation) throws Throwable {
-                Object[] args = invocation.getArguments();
-                String uiExtensionToken = (String) args[0];
-
-                if (UI_EXTENSION_TOKEN.equals(uiExtensionToken)) {
-                    return UI_EXTENSION_AUTHENTICATED_USER;
-                }
-
-                throw new OtpAuthenticationException("Invalid token");
-            }
-        }).when(otpService).getAuthenticationFromUiExtensionToken(anyString());
-
-        idpUserGroupService = mock(IdpUserGroupService.class);
-
-        otpAuthenticationProvider = new OtpAuthenticationProvider(
-                otpService, mock(NiFiProperties.class), mock(Authorizer.class), idpUserGroupService);
-    }
-
-    @Test
-    public void testUiExtensionPath() throws Exception {
-        when(idpUserGroupService.getUserGroups(anyString())).thenReturn(Collections.emptyList());
-
-        final OtpAuthenticationRequestToken request = new OtpAuthenticationRequestToken(UI_EXTENSION_TOKEN, false, null);
-
-        final NiFiAuthenticationToken result = (NiFiAuthenticationToken) otpAuthenticationProvider.authenticate(request);
-        final NiFiUserDetails details = (NiFiUserDetails) result.getPrincipal();
-        assertEquals(UI_EXTENSION_AUTHENTICATED_USER, details.getUsername());
-        assertNotNull(details.getNiFiUser());
-
-        assertNull(details.getNiFiUser().getGroups());
-
-        assertNotNull(details.getNiFiUser().getIdentityProviderGroups());
-        assertEquals(0, details.getNiFiUser().getIdentityProviderGroups().size());
-
-        assertNotNull(details.getNiFiUser().getAllGroups());
-        assertEquals(0, details.getNiFiUser().getAllGroups().size());
-
-        verify(otpService, times(1)).getAuthenticationFromUiExtensionToken(UI_EXTENSION_TOKEN);
-        verify(otpService, never()).getAuthenticationFromDownloadToken(anyString());
-    }
-
-    @Test
-    public void testDownload() throws Exception {
-        when(idpUserGroupService.getUserGroups(anyString())).thenReturn(Collections.emptyList());
-
-        final OtpAuthenticationRequestToken request = new OtpAuthenticationRequestToken(DOWNLOAD_TOKEN, true, null);
-
-        final NiFiAuthenticationToken result = (NiFiAuthenticationToken) otpAuthenticationProvider.authenticate(request);
-        final NiFiUserDetails details = (NiFiUserDetails) result.getPrincipal();
-        assertEquals(DOWNLOAD_AUTHENTICATED_USER, details.getUsername());
-        assertNotNull(details.getNiFiUser());
-
-        assertNull(details.getNiFiUser().getGroups());
-
-        assertNotNull(details.getNiFiUser().getIdentityProviderGroups());
-        assertEquals(0, details.getNiFiUser().getIdentityProviderGroups().size());
-
-        assertNotNull(details.getNiFiUser().getAllGroups());
-        assertEquals(0, details.getNiFiUser().getAllGroups().size());
-
-        verify(otpService, never()).getAuthenticationFromUiExtensionToken(anyString());
-        verify(otpService, times(1)).getAuthenticationFromDownloadToken(DOWNLOAD_TOKEN);
-    }
-
-    @Test
-    public void testWhenIdpUserGroupsArePresent() {
-        final String groupName1 = "group1";
-        final IdpUserGroup idpUserGroup1 = createIdpUserGroup(1, DOWNLOAD_AUTHENTICATED_USER, groupName1, IdpType.SAML);
-
-        final String groupName2 = "group2";
-        final IdpUserGroup idpUserGroup2 = createIdpUserGroup(2, DOWNLOAD_AUTHENTICATED_USER, groupName2, IdpType.SAML);
-
-        when(idpUserGroupService.getUserGroups(DOWNLOAD_AUTHENTICATED_USER)).thenReturn(Arrays.asList(idpUserGroup1, idpUserGroup2));
-
-        final OtpAuthenticationRequestToken request = new OtpAuthenticationRequestToken(DOWNLOAD_TOKEN, true, null);
-
-        final NiFiAuthenticationToken result = (NiFiAuthenticationToken) otpAuthenticationProvider.authenticate(request);
-        final NiFiUserDetails details = (NiFiUserDetails) result.getPrincipal();
-        assertEquals(DOWNLOAD_AUTHENTICATED_USER, details.getUsername());
-
-        final NiFiUser returnedUser = details.getNiFiUser();
-        assertNotNull(returnedUser);
-
-        // user-group-provider groups are null
-        assertNull(returnedUser.getGroups());
-
-        // identity-provider group contain the two groups
-        assertNotNull(returnedUser.getIdentityProviderGroups());
-        assertEquals(2, returnedUser.getIdentityProviderGroups().size());
-        assertTrue(returnedUser.getIdentityProviderGroups().contains(groupName1));
-        assertTrue(returnedUser.getIdentityProviderGroups().contains(groupName1));
-
-        verify(otpService, never()).getAuthenticationFromUiExtensionToken(anyString());
-        verify(otpService, times(1)).getAuthenticationFromDownloadToken(DOWNLOAD_TOKEN);
-    }
-
-    @Test
-    public void testWhenUserGroupProviderGroupsAndIdpUserGroupsArePresent() {
-        // setup idp user group service...
-
-        final String groupName1 = "group1";
-        final IdpUserGroup idpUserGroup1 = createIdpUserGroup(1, DOWNLOAD_AUTHENTICATED_USER, groupName1, IdpType.SAML);
-
-        final String groupName2 = "group2";
-        final IdpUserGroup idpUserGroup2 = createIdpUserGroup(2, DOWNLOAD_AUTHENTICATED_USER, groupName2, IdpType.SAML);
-
-        when(idpUserGroupService.getUserGroups(DOWNLOAD_AUTHENTICATED_USER)).thenReturn(Arrays.asList(idpUserGroup1, idpUserGroup2));
-
-        // setup managed authorizer...
-
-        final String groupName3 = "group3";
-        final Group group3 = new Group.Builder().identifierGenerateRandom().name(groupName3).build();
-
-        final UserGroupProvider userGroupProvider = mock(UserGroupProvider.class);
-        when(userGroupProvider.getUserAndGroups(DOWNLOAD_AUTHENTICATED_USER)).thenReturn(new UserAndGroups() {
-            @Override
-            public User getUser() {
-                return new User.Builder().identifier(DOWNLOAD_AUTHENTICATED_USER).identity(DOWNLOAD_AUTHENTICATED_USER).build();
-            }
-
-            @Override
-            public Set<Group> getGroups() {
-                return Collections.singleton(group3);
-            }
-        });
-
-        final AccessPolicyProvider accessPolicyProvider = mock(AccessPolicyProvider.class);
-        when(accessPolicyProvider.getUserGroupProvider()).thenReturn(userGroupProvider);
-
-        final ManagedAuthorizer managedAuthorizer = mock(ManagedAuthorizer.class);
-        when(managedAuthorizer.getAccessPolicyProvider()).thenReturn(accessPolicyProvider);
-
-        // create OTP auth provider using mocks from above
-
-        otpAuthenticationProvider = new OtpAuthenticationProvider(
-                otpService, mock(NiFiProperties.class), managedAuthorizer, idpUserGroupService);
-
-        // test...
-
-        final OtpAuthenticationRequestToken request = new OtpAuthenticationRequestToken(DOWNLOAD_TOKEN, true, null);
-
-        final NiFiAuthenticationToken result = (NiFiAuthenticationToken) otpAuthenticationProvider.authenticate(request);
-        final NiFiUserDetails details = (NiFiUserDetails) result.getPrincipal();
-        assertEquals(DOWNLOAD_AUTHENTICATED_USER, details.getUsername());
-
-        final NiFiUser returnedUser = details.getNiFiUser();
-        assertNotNull(returnedUser);
-
-        // Assert user-group-provider groups are correct
-        assertEquals(1, returnedUser.getGroups().size());
-        assertTrue(returnedUser.getGroups().contains(groupName3));
-
-        // Assert identity-provider groups are correct
-        assertEquals(2, returnedUser.getIdentityProviderGroups().size());
-        assertTrue(returnedUser.getIdentityProviderGroups().contains(groupName1));
-        assertTrue(returnedUser.getIdentityProviderGroups().contains(groupName2));
-
-        // Assert combined groups are correct
-        assertEquals(3, returnedUser.getAllGroups().size());
-        assertTrue(returnedUser.getAllGroups().contains(groupName1));
-        assertTrue(returnedUser.getAllGroups().contains(groupName2));
-        assertTrue(returnedUser.getAllGroups().contains(groupName3));
-
-        verify(otpService, never()).getAuthenticationFromUiExtensionToken(anyString());
-        verify(otpService, times(1)).getAuthenticationFromDownloadToken(DOWNLOAD_TOKEN);
-    }
-
-    private IdpUserGroup createIdpUserGroup(int id, String identity, String groupName, IdpType idpType) {
-        final IdpUserGroup userGroup = new IdpUserGroup();
-        userGroup.setId(id);
-        userGroup.setIdentity(identity);
-        userGroup.setGroupName(groupName);
-        userGroup.setType(idpType);
-        return userGroup;
-    }
-
-}
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/otp/OtpServiceTest.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/otp/OtpServiceTest.java
deleted file mode 100644
index 6ff920d..0000000
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/otp/OtpServiceTest.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.nifi.web.security.otp;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-import java.util.concurrent.TimeUnit;
-import org.apache.nifi.web.security.token.OtpAuthenticationToken;
-import org.junit.Before;
-import org.junit.Test;
-
-public class OtpServiceTest {
-
-    private final static String USER_1 = "user-identity-1";
-    private final static int CACHE_EXPIRY_TIME = 1;
-    private final static int WAIT_TIME = 2000;
-
-    private OtpService otpService;
-
-    @Before
-    public void setUp() throws Exception {
-        otpService = new OtpService();
-    }
-
-    @Test
-    public void testGetAuthenticationForValidDownloadToken() throws Exception {
-        final OtpAuthenticationToken authenticationToken = new OtpAuthenticationToken(USER_1);
-        final String downloadToken = otpService.generateDownloadToken(authenticationToken);
-        final String authenticatedUser = otpService.getAuthenticationFromDownloadToken(downloadToken);
-
-        assertNotNull(authenticatedUser);
-        assertEquals(USER_1, authenticatedUser);
-
-        try {
-            // ensure the token is no longer valid
-            otpService.getAuthenticationFromDownloadToken(downloadToken);
-            fail();
-        } catch (final OtpAuthenticationException oae) {}
-    }
-
-    @Test
-    public void testGetAuthenticationForValidUiExtensionToken() throws Exception {
-        final OtpAuthenticationToken authenticationToken = new OtpAuthenticationToken(USER_1);
-        final String uiExtensionToken = otpService.generateUiExtensionToken(authenticationToken);
-        final String authenticatedUser = otpService.getAuthenticationFromUiExtensionToken(uiExtensionToken);
-
-        assertNotNull(authenticatedUser);
-        assertEquals(USER_1, authenticatedUser);
-
-        try {
-            // ensure the token is no longer valid
-            otpService.getAuthenticationFromUiExtensionToken(uiExtensionToken);
-            fail();
-        } catch (final OtpAuthenticationException oae) {}
-    }
-
-    @Test(expected = OtpAuthenticationException.class)
-    public void testGetNonExistentDownloadToken() throws Exception {
-        otpService.getAuthenticationFromDownloadToken("Not a real download token");
-    }
-
-    @Test(expected = OtpAuthenticationException.class)
-    public void testGetNonExistentUiExtensionToken() throws Exception {
-        otpService.getAuthenticationFromUiExtensionToken("Not a real ui extension token");
-    }
-
-    @Test(expected = IllegalStateException.class)
-    public void testMaxDownloadTokenLimit() throws Exception {
-        // ensure we'll try to loop past the limit
-        for (int i = 1; i < OtpService.MAX_CACHE_SOFT_LIMIT + 10; i++) {
-            try {
-                final OtpAuthenticationToken authenticationToken = new OtpAuthenticationToken("user-identity-" + i);
-                otpService.generateDownloadToken(authenticationToken);
-            } catch (final IllegalStateException iae) {
-                // ensure we failed when we've passed the limit
-                assertEquals(OtpService.MAX_CACHE_SOFT_LIMIT + 1, i);
-                throw iae;
-            }
-        }
-    }
-
-    @Test(expected = IllegalStateException.class)
-    public void testMaxUiExtensionTokenLimit() throws Exception {
-        // ensure we'll try to loop past the limit
-        for (int i = 1; i < OtpService.MAX_CACHE_SOFT_LIMIT + 10; i++) {
-            try {
-                final OtpAuthenticationToken authenticationToken = new OtpAuthenticationToken("user-identity-" + i);
-                otpService.generateUiExtensionToken(authenticationToken);
-            } catch (final IllegalStateException iae) {
-                // ensure we failed when we've passed the limit
-                assertEquals(OtpService.MAX_CACHE_SOFT_LIMIT + 1, i);
-                throw iae;
-            }
-        }
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testNullTimeUnits() throws Exception {
-        new OtpService(0, null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testNegativeExpiration() throws Exception {
-        new OtpService(-1, TimeUnit.MINUTES);
-    }
-
-    @Test(expected = OtpAuthenticationException.class)
-    public void testUiExtensionTokenExpiration() throws Exception {
-        final OtpService otpServiceWithTightExpiration = new OtpService(CACHE_EXPIRY_TIME, TimeUnit.SECONDS);
-
-        final OtpAuthenticationToken authenticationToken = new OtpAuthenticationToken(USER_1);
-        final String downloadToken = otpServiceWithTightExpiration.generateUiExtensionToken(authenticationToken);
-
-        // sleep for 2 seconds which should sufficiently expire the valid token
-        Thread.sleep(WAIT_TIME);
-
-        // attempt to get the token now that it's expired
-        otpServiceWithTightExpiration.getAuthenticationFromUiExtensionToken(downloadToken);
-    }
-
-    @Test(expected = OtpAuthenticationException.class)
-    public void testDownloadTokenExpiration() throws Exception {
-        final OtpService otpServiceWithTightExpiration = new OtpService(CACHE_EXPIRY_TIME, TimeUnit.SECONDS);
-
-        final OtpAuthenticationToken authenticationToken = new OtpAuthenticationToken(USER_1);
-        final String downloadToken = otpServiceWithTightExpiration.generateDownloadToken(authenticationToken);
-
-        // sleep for 2 seconds which should sufficiently expire the valid token
-        Thread.sleep(WAIT_TIME);
-
-        // attempt to get the token now that it's expired
-        otpServiceWithTightExpiration.getAuthenticationFromDownloadToken(downloadToken);
-    }
-
-    @Test
-    public void testDownloadTokenIsTheSameForSubsequentRequests() {
-        final OtpAuthenticationToken authenticationToken = new OtpAuthenticationToken(USER_1);
-        final String downloadToken = otpService.generateDownloadToken(authenticationToken);
-        final String secondDownloadToken = otpService.generateDownloadToken(authenticationToken);
-
-        assertEquals(downloadToken, secondDownloadToken);
-    }
-
-    @Test
-    public void testDownloadTokenIsTheSameForSubsequentRequestsUntilUsed() {
-        final OtpAuthenticationToken authenticationToken = new OtpAuthenticationToken(USER_1);
-
-        // generate two tokens
-        final String downloadToken = otpService.generateDownloadToken(authenticationToken);
-        final String secondDownloadToken = otpService.generateDownloadToken(authenticationToken);
-
-        assertEquals(downloadToken, secondDownloadToken);
-
-        // use the token
-        otpService.getAuthenticationFromDownloadToken(downloadToken);
-
-        // make sure the next token is now different
-        final String thirdDownloadToken = otpService.generateDownloadToken(authenticationToken);
-        assertNotEquals(downloadToken, thirdDownloadToken);
-    }
-
-    @Test
-    public void testDownloadTokenIsValidForSubsequentGenerateAndUse() {
-        final OtpAuthenticationToken authenticationToken = new OtpAuthenticationToken(USER_1);
-
-        // generate a token
-        final String downloadToken = otpService.generateDownloadToken(authenticationToken);
-
-        // use the token
-        final String auth = otpService.getAuthenticationFromDownloadToken(downloadToken);
-        assertEquals(USER_1, auth);
-
-        // generate a new token, make sure it's different, then authenticate with it
-        final String secondDownloadToken = otpService.generateDownloadToken(authenticationToken);
-        assertNotEquals(downloadToken, secondDownloadToken);
-        final String secondAuth = otpService.getAuthenticationFromDownloadToken(secondDownloadToken);
-        assertEquals(USER_1, secondAuth);
-    }
-
-    @Test
-    public void testSingleUserCannotGenerateTooManyUIExtensionTokens() throws Exception {
-        // ensure we'll try to loop past the limit
-        for (int i = 1; i < OtpService.MAX_CACHE_SOFT_LIMIT + 10; i++) {
-            final OtpAuthenticationToken authenticationToken = new OtpAuthenticationToken("user-identity-1");
-            otpService.generateUiExtensionToken(authenticationToken);
-
-        }
-
-        // make sure other users can still generate tokens
-        final OtpAuthenticationToken anotherAuthenticationToken = new OtpAuthenticationToken("user-identity-2");
-        final String auth = otpService.generateUiExtensionToken(anotherAuthenticationToken);
-        assertNotNull(auth);
-    }
-
-    @Test
-    public void testSingleUserCannotGenerateTooManyDownloadTokens() throws Exception {
-        // ensure we'll try to loop past the limit
-        for (int i = 1; i < OtpService.MAX_CACHE_SOFT_LIMIT + 10; i++) {
-            final OtpAuthenticationToken authenticationToken = new OtpAuthenticationToken("user-identity-1");
-            otpService.generateDownloadToken(authenticationToken);
-
-        }
-
-        // make sure other users can still generate tokens
-        final OtpAuthenticationToken anotherAuthenticationToken = new OtpAuthenticationToken("user-identity-2");
-        final String auth = otpService.generateDownloadToken(anotherAuthenticationToken);
-        assertNotNull(auth);
-    }
-
-    @Test(expected = OtpAuthenticationException.class)
-    public void testDownloadTokenNotValidAfterUse() throws Exception {
-        final OtpAuthenticationToken authenticationToken = new OtpAuthenticationToken(USER_1);
-        final String downloadToken = otpService.generateDownloadToken(authenticationToken);
-
-        // use the token
-        final String authenticatedUser = otpService.getAuthenticationFromDownloadToken(downloadToken);
-
-        // check we authenticated successfully
-        assertNotNull(authenticatedUser);
-        assertEquals(USER_1, authenticatedUser);
-
-        // check authentication fails with the used token
-        final String failedAuthentication = otpService.getAuthenticationFromDownloadToken(downloadToken);
-    }
-
-    @Test(expected = OtpAuthenticationException.class)
-    public void testUIExtensionTokenNotValidAfterUse() throws Exception {
-        final OtpAuthenticationToken authenticationToken = new OtpAuthenticationToken(USER_1);
-        final String downloadToken = otpService.generateDownloadToken(authenticationToken);
-
-        // use the token
-        final String authenticatedUser = otpService.getAuthenticationFromUiExtensionToken(downloadToken);
-
-        // check we authenticated successfully
-        assertNotNull(authenticatedUser);
-        assertEquals(USER_1, authenticatedUser);
-
-        // check authentication fails with the used token
-        final String failedAuthentication = otpService.getAuthenticationFromUiExtensionToken(downloadToken);
-    }
-
-    @Test
-    public void testShouldGenerateNewDownloadTokenAfterExpiration() throws Exception {
-        final OtpService otpServiceWithTightExpiration = new OtpService(CACHE_EXPIRY_TIME, TimeUnit.SECONDS);
-
-        final OtpAuthenticationToken authenticationToken = new OtpAuthenticationToken(USER_1);
-        final String downloadToken = otpServiceWithTightExpiration.generateDownloadToken(authenticationToken);
-
-        // sleep for 2 seconds which should sufficiently expire the valid token
-        Thread.sleep(WAIT_TIME);
-
-        // get a new token and make sure the previous one had expired
-        final String secondDownloadToken = otpServiceWithTightExpiration.generateDownloadToken(authenticationToken);
-        assertNotEquals(downloadToken, secondDownloadToken);
-    }
-
-    @Test
-    public void testDownloadTokenRemainsTheSameBeforeExpirationButNotAfter() throws Exception {
-        final OtpService otpServiceWithTightExpiration = new OtpService(CACHE_EXPIRY_TIME, TimeUnit.SECONDS);
-
-        final OtpAuthenticationToken authenticationToken = new OtpAuthenticationToken(USER_1);
-        final String downloadToken = otpServiceWithTightExpiration.generateDownloadToken(authenticationToken);
-        final String secondDownloadToken = otpServiceWithTightExpiration.generateDownloadToken(authenticationToken);
-
-        assertEquals(downloadToken, secondDownloadToken);
-
-        // sleep for 2 seconds which should sufficiently expire the valid token
-        Thread.sleep(WAIT_TIME);
-
-        // get a new token and make sure the previous one had expired
-        final String thirdDownloadToken = otpServiceWithTightExpiration.generateDownloadToken(authenticationToken);
-        assertNotEquals(downloadToken, thirdDownloadToken);
-    }
-}
\ No newline at end of file
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-actions.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-actions.js
index 5ae7945..a7ee61f 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-actions.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-actions.js
@@ -151,7 +151,6 @@
             api: '../nifi-api',
             controller: '../nifi-api/controller',
             parameterContexts: '../nifi-api/parameter-contexts',
-            downloadToken: '../nifi-api/access/download-token'
         }
     };
 
@@ -1648,26 +1647,11 @@
             }
 
             if (processGroupId !== null) {
-                nfCommon.getAccessToken(config.urls.downloadToken).done(function (downloadToken) {
-                    var parameters = {};
+                var parameters = {};
 
-                    // conditionally include the download token
-                    if (!nfCommon.isBlank(downloadToken)) {
-                        parameters['access_token'] = downloadToken;
-                    }
-
-                    // open the url
-                    var uri = '../nifi-api/process-groups/' + encodeURIComponent(processGroupId) + '/download';
-                    if (!$.isEmptyObject(parameters)) {
-                        uri += ('?' + $.param(parameters));
-                    }
-                    window.open(uri);
-                }).fail(function () {
-                    nfDialog.showOkDialog({
-                        headerText: 'Download Flow Definition',
-                        dialogContent: 'Unable to generate access token for downloading content.'
-                    });
-                });
+                // open the url
+                var uri = '../nifi-api/process-groups/' + encodeURIComponent(processGroupId) + '/download';
+                window.open(uri);
             }
         },
 
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-custom-ui.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-custom-ui.js
index de26b1f..d10cc3c 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-custom-ui.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-custom-ui.js
@@ -55,35 +55,22 @@
          */
         showCustomUi: function (entity, uri, editable) {
             return $.Deferred(function (deferred) {
-                nfCommon.getAccessToken('../nifi-api/access/ui-extension-token').done(function (uiExtensionToken) {
-                    // record the processor id
-                    $('#shell-close-button');
+                // record the processor id
+                $('#shell-close-button');
 
-                    var revision = nfClient.getRevision(entity);
+                var revision = nfClient.getRevision(entity);
 
-                    // build the customer ui params
-                    var customUiParams = {
-                        'id': entity.id,
-                        'revision': revision.version,
-                        'clientId': revision.clientId,
-                        'editable': editable,
-                        'disconnectedNodeAcknowledged': nfStorage.isDisconnectionAcknowledged()
-                    };
+                // build the customer ui params
+                var customUiParams = {
+                    'id': entity.id,
+                    'revision': revision.version,
+                    'clientId': revision.clientId,
+                    'editable': editable,
+                    'disconnectedNodeAcknowledged': nfStorage.isDisconnectionAcknowledged()
+                };
 
-                    // conditionally include the ui extension token
-                    if (!nfCommon.isBlank(uiExtensionToken)) {
-                        customUiParams['access_token'] = uiExtensionToken;
-                    }
-
-                    // show the shell
-                    nfShell.showPage('..' + uri + '?' + $.param(customUiParams), false).done(function () {
-                        deferred.resolve();
-                    });
-                }).fail(function () {
-                    nfDialog.showOkDialog({
-                        headerText: 'Advanced Configuration',
-                        dialogContent: 'Unable to generate access token for accessing the advanced configuration dialog.'
-                    });
+                // show the shell
+                nfShell.showPage('..' + uri + '?' + $.param(customUiParams), false).done(function () {
                     deferred.resolve();
                 });
             }).promise();
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-queue-listing.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-queue-listing.js
index 89131bd..7aeb3e5 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-queue-listing.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-queue-listing.js
@@ -67,8 +67,6 @@
      */
     var config = {
         urls: {
-            uiExtensionToken: '../nifi-api/access/ui-extension-token',
-            downloadToken: '../nifi-api/access/download-token'
         }
     };
 
@@ -247,33 +245,20 @@
     var downloadContent = function (flowFileSummary) {
         var dataUri = ((nfCommon.isDefinedAndNotNull(flowFileSummary.uri))?flowFileSummary.uri:$('#flowfile-uri').text())+ '/content';
 
-        // perform the request once we've received a token
-        nfCommon.getAccessToken(config.urls.downloadToken).done(function (downloadToken) {
-            var parameters = {};
+        var parameters = {};
 
-            // conditionally include the ui extension token
-            if (!nfCommon.isBlank(downloadToken)) {
-                parameters['access_token'] = downloadToken;
-            }
+        // conditionally include the cluster node id
+        var clusterNodeId = (nfCommon.isDefinedAndNotNull(flowFileSummary.clusterNodeId))?flowFileSummary.clusterNodeId:$('#flowfile-cluster-node-id').text();
+        if (!nfCommon.isBlank(clusterNodeId)) {
+            parameters['clusterNodeId'] = clusterNodeId;
+        }
 
-            // conditionally include the cluster node id
-            var clusterNodeId = (nfCommon.isDefinedAndNotNull(flowFileSummary.clusterNodeId))?flowFileSummary.clusterNodeId:$('#flowfile-cluster-node-id').text();
-            if (!nfCommon.isBlank(clusterNodeId)) {
-                parameters['clusterNodeId'] = clusterNodeId;
-            }
-
-            // open the url
-            if ($.isEmptyObject(parameters)) {
-                window.open(dataUri);
-            } else {
-                window.open(dataUri + '?' + $.param(parameters));
-            }
-        }).fail(function () {
-            nfDialog.showOkDialog({
-                headerText: 'Queue Listing',
-                dialogContent: 'Unable to generate access token for downloading content.'
-            });
-        });
+        // open the url
+        if ($.isEmptyObject(parameters)) {
+            window.open(dataUri);
+        } else {
+            window.open(dataUri + '?' + $.param(parameters));
+        }
     };
 
     /**
@@ -285,80 +270,37 @@
 
         var dataUri = ((nfCommon.isDefinedAndNotNull(flowFileSummary.uri))?flowFileSummary.uri:$('#flowfile-uri').text())+ '/content';
 
-        // generate tokens as necessary
-        var getAccessTokens = $.Deferred(function (deferred) {
-            if (nfStorage.hasItem('jwt')) {
-                // generate a token for the ui extension and another for the callback
-                var uiExtensionToken = $.ajax({
-                    type: 'POST',
-                    url: config.urls.uiExtensionToken
-                });
-                var downloadToken = $.ajax({
-                    type: 'POST',
-                    url: config.urls.downloadToken
-                });
+        var dataUriParameters = {};
 
-                // wait for each token
-                $.when(uiExtensionToken, downloadToken).done(function (uiExtensionTokenResult, downloadTokenResult) {
-                    var uiExtensionToken = uiExtensionTokenResult[0];
-                    var downloadToken = downloadTokenResult[0];
-                    deferred.resolve(uiExtensionToken, downloadToken);
-                }).fail(function () {
-                    nfDialog.showOkDialog({
-                        headerText: 'Queue Listing',
-                        dialogContent: 'Unable to generate access token for viewing content.'
-                    });
-                    deferred.reject();
-                });
-            } else {
-                deferred.resolve('', '');
-            }
-        }).promise();
+        // conditionally include the cluster node id
+        var clusterNodeId = (nfCommon.isDefinedAndNotNull(flowFileSummary.clusterNodeId))?flowFileSummary.clusterNodeId:$('#flowfile-cluster-node-id').text();
+        if (!nfCommon.isBlank(clusterNodeId)) {
+            dataUriParameters['clusterNodeId'] = clusterNodeId;
+        }
 
-        // perform the request after we've received the tokens
-        getAccessTokens.done(function (uiExtensionToken, downloadToken) {
-            var dataUriParameters = {};
+        // include parameters if necessary
+        if ($.isEmptyObject(dataUriParameters) === false) {
+            dataUri = dataUri + '?' + $.param(dataUriParameters);
+        }
 
-            // conditionally include the cluster node id
-            var clusterNodeId = (nfCommon.isDefinedAndNotNull(flowFileSummary.clusterNodeId))?flowFileSummary.clusterNodeId:$('#flowfile-cluster-node-id').text();
-            if (!nfCommon.isBlank(clusterNodeId)) {
-                dataUriParameters['clusterNodeId'] = clusterNodeId;
-            }
+        // open the content viewer
+        var contentViewerUrl = $('#nifi-content-viewer-url').text();
 
-            // include the download token if applicable
-            if (!nfCommon.isBlank(downloadToken)) {
-                dataUriParameters['access_token'] = downloadToken;
-            }
+        // if there's already a query string don't add another ?... this assumes valid
+        // input meaning that if the url has already included a ? it also contains at
+        // least one query parameter
+        if (contentViewerUrl.indexOf('?') === -1) {
+            contentViewerUrl += '?';
+        } else {
+            contentViewerUrl += '&';
+        }
 
-            // include parameters if necessary
-            if ($.isEmptyObject(dataUriParameters) === false) {
-                dataUri = dataUri + '?' + $.param(dataUriParameters);
-            }
+        var contentViewerParameters = {
+            'ref': dataUri
+        };
 
-            // open the content viewer
-            var contentViewerUrl = $('#nifi-content-viewer-url').text();
-
-            // if there's already a query string don't add another ?... this assumes valid
-            // input meaning that if the url has already included a ? it also contains at
-            // least one query parameter
-            if (contentViewerUrl.indexOf('?') === -1) {
-                contentViewerUrl += '?';
-            } else {
-                contentViewerUrl += '&';
-            }
-
-            var contentViewerParameters = {
-                'ref': dataUri
-            };
-
-            // include the download token if applicable
-            if (!nfCommon.isBlank(uiExtensionToken)) {
-                contentViewerParameters['access_token'] = uiExtensionToken;
-            }
-
-            // open the content viewer
-            window.open(contentViewerUrl + $.param(contentViewerParameters));
-        });
+        // open the content viewer
+        window.open(contentViewerUrl + $.param(contentViewerParameters));
     };
 
     /**
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/nf-common.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/nf-common.js
index 2b79896..3d46d8b 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/nf-common.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/nf-common.js
@@ -1196,29 +1196,6 @@
         },
 
         /**
-         * Gets an access token from the specified url.
-         *
-         * @param accessTokenUrl    The access token
-         * @returns the access token as a deferred
-         */
-        getAccessToken: function (accessTokenUrl) {
-            return $.Deferred(function (deferred) {
-                if (nfStorage.hasItem('jwt')) {
-                    $.ajax({
-                        type: 'POST',
-                        url: accessTokenUrl
-                    }).done(function (token) {
-                        deferred.resolve(token);
-                    }).fail(function () {
-                        deferred.reject();
-                    })
-                } else {
-                    deferred.resolve('');
-                }
-            }).promise();
-        },
-
-        /**
          * Constants for time duration formatting.
          */
         MILLIS_PER_DAY: 86400000,
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/provenance/nf-provenance-table.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/provenance/nf-provenance-table.js
index 2ca9abc..6973691 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/provenance/nf-provenance-table.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/provenance/nf-provenance-table.js
@@ -70,9 +70,7 @@
                 provenanceEvents: '../nifi-api/provenance-events/',
                 clusterSearch: '../nifi-api/flow/cluster/search-results',
                 d3Script: 'js/d3/build/d3.min.js',
-                lineageScript: 'js/nf/provenance/nf-provenance-lineage.js',
-                uiExtensionToken: '../nifi-api/access/ui-extension-token',
-                downloadToken: '../nifi-api/access/download-token'
+                lineageScript: 'js/nf/provenance/nf-provenance-lineage.js'
             }
         };
 
@@ -92,33 +90,20 @@
             // build the url
             var dataUri = config.urls.provenanceEvents + encodeURIComponent(eventId) + '/content/' + encodeURIComponent(direction);
 
-            // perform the request once we've received a token
-            nfCommon.getAccessToken(config.urls.downloadToken).done(function (downloadToken) {
-                var parameters = {};
+            var parameters = {};
 
-                // conditionally include the ui extension token
-                if (!nfCommon.isBlank(downloadToken)) {
-                    parameters['access_token'] = downloadToken;
-                }
+            // conditionally include the cluster node id
+            var clusterNodeId = $('#provenance-event-cluster-node-id').text();
+            if (!nfCommon.isBlank(clusterNodeId)) {
+                parameters['clusterNodeId'] = clusterNodeId;
+            }
 
-                // conditionally include the cluster node id
-                var clusterNodeId = $('#provenance-event-cluster-node-id').text();
-                if (!nfCommon.isBlank(clusterNodeId)) {
-                    parameters['clusterNodeId'] = clusterNodeId;
-                }
-
-                // open the url
-                if ($.isEmptyObject(parameters)) {
-                    window.open(dataUri);
-                } else {
-                    window.open(dataUri + '?' + $.param(parameters));
-                }
-            }).fail(function () {
-                nfDialog.showOkDialog({
-                    headerText: 'Provenance',
-                    dialogContent: 'Unable to generate access token for downloading content.'
-                });
-            });
+            // open the url
+            if ($.isEmptyObject(parameters)) {
+                window.open(dataUri);
+            } else {
+                window.open(dataUri + '?' + $.param(parameters));
+            }
         };
 
         /**
@@ -133,80 +118,37 @@
             // build the uri to the data
             var dataUri = controllerUri + 'provenance-events/' + encodeURIComponent(eventId) + '/content/' + encodeURIComponent(direction);
 
-            // generate tokens as necessary
-            var getAccessTokens = $.Deferred(function (deferred) {
-                if (nfStorage.hasItem('jwt')) {
-                    // generate a token for the ui extension and another for the callback
-                    var uiExtensionToken = $.ajax({
-                        type: 'POST',
-                        url: config.urls.uiExtensionToken
-                    });
-                    var downloadToken = $.ajax({
-                        type: 'POST',
-                        url: config.urls.downloadToken
-                    });
+            var dataUriParameters = {};
 
-                    // wait for each token
-                    $.when(uiExtensionToken, downloadToken).done(function (uiExtensionTokenResult, downloadTokenResult) {
-                        var uiExtensionToken = uiExtensionTokenResult[0];
-                        var downloadToken = downloadTokenResult[0];
-                        deferred.resolve(uiExtensionToken, downloadToken);
-                    }).fail(function () {
-                        nfDialog.showOkDialog({
-                            headerText: 'Provenance',
-                            dialogContent: 'Unable to generate access token for viewing content.'
-                        });
-                        deferred.reject();
-                    });
-                } else {
-                    deferred.resolve('', '');
-                }
-            }).promise();
+            // conditionally include the cluster node id
+            var clusterNodeId = $('#provenance-event-cluster-node-id').text();
+            if (!nfCommon.isBlank(clusterNodeId)) {
+                dataUriParameters['clusterNodeId'] = clusterNodeId;
+            }
 
-            // perform the request after we've received the tokens
-            getAccessTokens.done(function (uiExtensionToken, downloadToken) {
-                var dataUriParameters = {};
+            // include parameters if necessary
+            if ($.isEmptyObject(dataUriParameters) === false) {
+                dataUri = dataUri + '?' + $.param(dataUriParameters);
+            }
 
-                // conditionally include the cluster node id
-                var clusterNodeId = $('#provenance-event-cluster-node-id').text();
-                if (!nfCommon.isBlank(clusterNodeId)) {
-                    dataUriParameters['clusterNodeId'] = clusterNodeId;
-                }
+            // open the content viewer
+            var contentViewerUrl = $('#nifi-content-viewer-url').text();
 
-                // include the download token if applicable
-                if (!nfCommon.isBlank(downloadToken)) {
-                    dataUriParameters['access_token'] = downloadToken;
-                }
+            // if there's already a query string don't add another ?... this assumes valid
+            // input meaning that if the url has already included a ? it also contains at
+            // least one query parameter
+            if (contentViewerUrl.indexOf('?') === -1) {
+                contentViewerUrl += '?';
+            } else {
+                contentViewerUrl += '&';
+            }
 
-                // include parameters if necessary
-                if ($.isEmptyObject(dataUriParameters) === false) {
-                    dataUri = dataUri + '?' + $.param(dataUriParameters);
-                }
+            var contentViewerParameters = {
+                'ref': dataUri
+            };
 
-                // open the content viewer
-                var contentViewerUrl = $('#nifi-content-viewer-url').text();
-
-                // if there's already a query string don't add another ?... this assumes valid
-                // input meaning that if the url has already included a ? it also contains at
-                // least one query parameter
-                if (contentViewerUrl.indexOf('?') === -1) {
-                    contentViewerUrl += '?';
-                } else {
-                    contentViewerUrl += '&';
-                }
-
-                var contentViewerParameters = {
-                    'ref': dataUri
-                };
-
-                // include the download token if applicable
-                if (!nfCommon.isBlank(uiExtensionToken)) {
-                    contentViewerParameters['access_token'] = uiExtensionToken;
-                }
-
-                // open the content viewer
-                window.open(contentViewerUrl + $.param(contentViewerParameters));
-            });
+            // open the content viewer
+            window.open(contentViewerUrl + $.param(contentViewerParameters));
         };
 
         /**
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/templates/nf-templates-table.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/templates/nf-templates-table.js
index 4bd0c31..19919bc 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/templates/nf-templates-table.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/templates/nf-templates-table.js
@@ -51,8 +51,7 @@
      */
     var config = {
         urls: {
-            templates: '../nifi-api/flow/templates',
-            downloadToken: '../nifi-api/access/download-token'
+            templates: '../nifi-api/flow/templates'
         }
     };
 
@@ -204,26 +203,7 @@
      * @param {object} templateEntity     The template
      */
     var downloadTemplate = function (templateEntity) {
-        nfCommon.getAccessToken(config.urls.downloadToken).done(function (downloadToken) {
-            var parameters = {};
-
-            // conditionally include the download token
-            if (!nfCommon.isBlank(downloadToken)) {
-                parameters['access_token'] = downloadToken;
-            }
-
-            // open the url
-            if ($.isEmptyObject(parameters)) {
-                window.open(templateEntity.template.uri + '/download');
-            } else {
-                window.open(templateEntity.template.uri + '/download' + '?' + $.param(parameters));
-            }
-        }).fail(function () {
-            nfDialog.showOkDialog({
-                headerText: 'Download Template',
-                dialogContent: 'Unable to generate access token for downloading content.'
-            });
-        });
+        window.open(templateEntity.template.uri + '/download');
     };
 
     return {
diff --git a/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/security/authentication/oidc/OidcService.java b/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/security/authentication/oidc/OidcService.java
index 65b160b..1dd3cfb 100644
--- a/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/security/authentication/oidc/OidcService.java
+++ b/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/security/authentication/oidc/OidcService.java
@@ -45,7 +45,7 @@
     private Cache<CacheKey, String> jwtLookupForCompletedRequests; // identifier from cookie -> jwt or identity (and generate jwt on retrieval)
 
     /**
-     * Creates a new OtpService with an expiration of 1 minute.
+     * Creates a new OIDC Service with an expiration of 1 minute.
      *
      * @param identityProvider          The identity provider
      */
@@ -55,7 +55,7 @@
     }
 
     /**
-     * Creates a new OtpService.
+     * Creates a new OIDC Service.
      *
      * @param identityProvider          The identity provider
      * @param duration                  The expiration duration