class Net::IMAP::SASL::AuthenticationExchange
AuthenticationExchange
由 Net::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
只是委托给 ::build
和 authenticate
,如下所示
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
属性
公共类方法
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
组合创建新身份验证器和新身份验证交换的便捷方法。
client
必须是 SASL::ClientAdapter
的实例。
mechanism
必须是 SASL
机制名称,作为字符串或符号。
sasl_ir
允许或禁止发送“初始响应”,具体取决于服务器功能、机制身份验证器和客户端适配器是否都支持它。默认为 true
。
mechanism
、args
、kwargs
和 block
都将转发到 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
# 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
以使用 authenticator
为 client
执行身份验证交换。身份验证失败将引发异常。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
# 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
# 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
私有实例方法
# 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
# 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