# File lib/net/ssh/authentication/session.rb, line 53
    def authenticate(next_service, username, password=nil)
      debug { "beginning authentication of `#{username}'" }

      transport.send_message(transport.service_request("ssh-userauth"))
      expect_message(SERVICE_ACCEPT)

      key_manager = KeyManager.new(logger, options)
      keys.each { |key| key_manager.add(key) } unless keys.empty?
      key_data.each { |key2| key_manager.add_key_data(key2) } unless key_data.empty?

      attempted = []

      @auth_methods.each do |name|
        begin
          next unless @allowed_auth_methods.include?(name)
          attempted << name

          debug { "trying #{name}" }
          begin 
            method = Methods.const_get(name.split(/\W+/).map { |p| p.capitalize }.join).new(self, :key_manager => key_manager)
          rescue NameError
            debug{"Mechanism #{name} was requested, but isn't a known type.  Ignoring it."}
            next
          end

          return true if method.authenticate(next_service, username, password)
        rescue Net::SSH::Authentication::DisallowedMethod
        end
      end

      error { "all authorization methods failed (tried #{attempted.join(', ')})" }
      return false
    ensure
      key_manager.finish if key_manager
    end