class Net::IMAP::SASL::AuthenticationExchange

AuthenticationExchangeNet::IMAP#authenticate 内部使用。但该 API 仍处于实验阶段,可能会发生变化。

待办事项:捕获 process 中的异常并发送 cancel_response。待办事项:如果命令在取消后成功,则引发错误。待办事项:与更多客户端一起使用,以验证 API 是否可以容纳它们。待办事项:将 ClientAdapter#service 传递给 SASL.authenticator

AuthenticationExchange 表示尝试对 SASL 客户端进行身份验证,以连接到 SASL 服务器的单次尝试。它由客户端适配器、机制名称和机制身份验证器创建。当调用 authenticate 时,它将向服务器发送适当的身份验证命令,成功时返回客户端响应,失败时引发异常。

在大多数情况下,客户端根本不需要直接使用 SASL::AuthenticationExchange。而是使用 SASL::ClientAdapter#authenticate。如果需要自定义,则自定义客户端适配器可能是该代码的最佳位置。

def authenticate(...)
  MyClient::SASLAdapter.new(self).authenticate(...)
end

SASL::ClientAdapter#authenticate 委托给 ::authenticate,如下所示

def authenticate(...)
  sasl_adapter = MyClient::SASLAdapter.new(self)
  SASL::AuthenticationExchange.authenticate(sasl_adapter, ...)
end

::authenticate 只是委托给 ::buildauthenticate,如下所示

def authenticate(...)
  sasl_adapter = MyClient::SASLAdapter.new(self)
  SASL::AuthenticationExchange
    .build(sasl_adapter, ...)
    .authenticate
end

::build 委托给 SASL.authenticator::new,如下所示

def authenticate(mechanism, ...)
  sasl_adapter = MyClient::SASLAdapter.new(self)
  authenticator = SASL.authenticator(mechanism, ...)
  SASL::AuthenticationExchange
    .new(sasl_adapter, mechanism, authenticator)
    .authenticate
end

属性

authenticator[R]
client[R]
mechanism[R]

公共类方法

authenticate(...) 单击以切换源代码

build(...).authenticate 的便捷方法

另请参阅:SASL::ClientAdapter#authenticate

# File net-imap-0.5.4/lib/net/imap/sasl/authentication_exchange.rb, line 61
def self.authenticate(...) build(...).authenticate end
build(client, mechanism, *args, sasl_ir: true, **kwargs, &block) 单击以切换源代码

组合创建新身份验证器和新身份验证交换的便捷方法。

client 必须是 SASL::ClientAdapter 的实例。

mechanism 必须是 SASL 机制名称,作为字符串或符号。

sasl_ir 允许或禁止发送“初始响应”,具体取决于服务器功能、机制身份验证器和客户端适配器是否都支持它。默认为 true

mechanismargskwargsblock 都将转发到 SASL.authenticator。使用 registry kwarg 来覆盖全局 SASL::Authenticators 注册表。

# File net-imap-0.5.4/lib/net/imap/sasl/authentication_exchange.rb, line 77
def self.build(client, mechanism, *args, sasl_ir: true, **kwargs, &block)
  authenticator = SASL.authenticator(mechanism, *args, **kwargs, &block)
  new(client, mechanism, authenticator, sasl_ir: sasl_ir)
end
new(client, mechanism, authenticator, sasl_ir: true) 单击以切换源代码
# File net-imap-0.5.4/lib/net/imap/sasl/authentication_exchange.rb, line 84
def initialize(client, mechanism, authenticator, sasl_ir: true)
  @client = client
  @mechanism = Authenticators.normalize_name(mechanism)
  @authenticator = authenticator
  @sasl_ir = sasl_ir
  @processed = false
end

公共实例方法

authenticate() 单击以切换源代码

调用 authenticate 以使用 authenticatorclient 执行身份验证交换。身份验证失败将引发异常。RESPONSE_ERRORS 中的异常以外的任何异常都将断开连接。

# File net-imap-0.5.4/lib/net/imap/sasl/authentication_exchange.rb, line 96
def authenticate
  client.run_command(mechanism, initial_response) { process _1 }
    .tap { raise AuthenticationIncomplete, _1 unless done? }
rescue *client.response_errors
  raise # but don't drop the connection
rescue
  client.drop_connection
  raise
rescue Exception # rubocop:disable Lint/RescueException
  client.drop_connection!
  raise
end
done?() 单击以切换源代码
# File net-imap-0.5.4/lib/net/imap/sasl/authentication_exchange.rb, line 117
def done?
  authenticator.respond_to?(:done?) ? authenticator.done? : @processed
end
send_initial_response?() 单击以切换源代码
# File net-imap-0.5.4/lib/net/imap/sasl/authentication_exchange.rb, line 109
def send_initial_response?
  @sasl_ir &&
    authenticator.respond_to?(:initial_response?) &&
    authenticator.initial_response? &&
    client.sasl_ir_capable? &&
    client.auth_capable?(mechanism)
end

私有实例方法

initial_response() 单击以切换源代码
# File net-imap-0.5.4/lib/net/imap/sasl/authentication_exchange.rb, line 125
def initial_response
  return unless send_initial_response?
  client.encode_ir authenticator.process nil
end
process(challenge) 单击以切换源代码
# File net-imap-0.5.4/lib/net/imap/sasl/authentication_exchange.rb, line 130
def process(challenge)
  client.encode authenticator.process client.decode challenge
ensure
  @processed = true
end