protected OpenIdUser discover(Identifier identifier, HttpServletRequest request)
      throws Exception {
    OpenIdUser user = _userCache.get(identifier.getUrl(), true);
    if (user == null) {
      try {
        user = _context.getDiscovery().discover(identifier, _context);
      } catch (IOException e) {
        if (!_identifierAsServer) throw e;
      }
      if (user == null) {
        if (!_identifierAsServer) return null;

        // user = new OpenIdUser(identifier.getId(), YadisDiscovery.IDENTIFIER_SELECT,
        // identifier.getUrl(), null);
        user =
            OpenIdUser.populate(
                identifier.getId(), YadisDiscovery.IDENTIFIER_SELECT, identifier.getUrl(), null);
      }

      _userCache.put(identifier.getUrl(), user);
    }

    _listener.onDiscovery(user, request);
    request.setAttribute(OpenIdUser.ATTR_NAME, user);
    return user;
  }
 /**
  * Returns true if the user is successfully associated with his openid provider; The {@link
  * OpenIdUser} is persisted if successful.
  */
 public boolean associate(
     OpenIdUser user, HttpServletRequest request, HttpServletResponse response) throws Exception {
   if (_context.getAssociation().associate(user, _context)) {
     _manager.saveUser(user, request, response);
     return true;
   }
   return false;
 }
 /**
  * Returns true if the user has succeeded authentication on his openid provider; The {@link
  * OpenIdUser} is persisted if successful.
  */
 public boolean verifyAuth(
     OpenIdUser user, HttpServletRequest request, HttpServletResponse response) throws Exception {
   if (_context.getAssociation().verifyAuth(user, getAuthParameters(request), _context)) {
     _listener.onAuthenticate(user, request);
     _manager.saveUser(user, request, response);
     return true;
   }
   return false;
 }
 /**
  * Returns true if the user is successfully associated and redirected to his openid provider for
  * authentication; The {@link OpenIdUser} is persisted if successful.
  */
 public boolean associateAndAuthenticate(
     OpenIdUser user,
     HttpServletRequest request,
     HttpServletResponse response,
     String trustRoot,
     String realm,
     String returnTo)
     throws Exception {
   return _context.getAssociation().associate(user, _context)
       && authenticate(user, request, response, trustRoot, realm, returnTo);
 }