code: @RequestMapping(method = RequestMethod.GET)
    public final ModelAndView processExternalAuthentication(HttpServletRequest httpRequest, HttpServletResponse httpResponse)
        throws ExternalAuthenticationException, IOException {
  
      // Start the external authentication process ...
      //
      final String key = ExternalAuthentication.startExternalAuthentication(httpRequest);
      logger.debug("External authentication started. [key='{}',client-ip-address='{}']", key, httpRequest.getRemoteAddr());
  
      final ProfileRequestContext<?, ?> profileRequestContext = ExternalAuthentication.getProfileRequestContext(key, httpRequest);
  
      // Store the authentication key in the HTTP session.
      //
      HttpSession session = httpRequest.getSession();
      session.setAttribute(EXTAUTHN_KEY_ATTRIBUTE_NAME, key);
  
      // Initialize services and process the request
      try {
        this.processIsPassive(profileRequestContext);
        this.initializeServices(profileRequestContext);
        this.servicesProcessRequest(profileRequestContext);
      }
      catch (ExternalAutenticationErrorCodeException e) {
        this.error(httpRequest, httpResponse, e);
        return null;
      }
  
      // Hand over to implementation ...
      //
      return this.doExternalAuthentication(httpRequest, httpResponse, key, profileRequestContext);
    }
docs: Main entry point for the external authentication controller. The implementation starts a Shibboleth external
  authentication process and hands over the control to
  {@link #doExternalAuthentication(HttpServletRequest, HttpServletResponse, String, ProfileRequestContext)}.
  
  @param httpRequest
  the HTTP request
  @param httpResponse
  the HTTP response
  @return a model and view object
  @throws ExternalAuthenticationException
  for Shibboleth session errors
  @throws IOException
  for IO errors