class Net::IMAP::SASL::XOAuth2Authenticator
“XOAUTH2” SASL 机制的验证器。此机制最初为 GMail 创建,并被托管电子邮件提供商广泛采用。XOAUTH2 已由 Google 和 Microsoft 记录在案。
此机制需要一个 OAuth2 访问令牌,该令牌已通过适当的 OAuth2 范围授权以访问用户的服务。大多数这些范围不是标准化的 - 请查阅每个服务提供商的文档以获取其范围。
尽管此机制从未标准化,并且已被 “OAUTHBEARER” 取代,但它仍然得到广泛的支持。
属性
从 Google 的原始 XOAUTH2 文档中,尚不清楚 “User” 是指身份验证身份 (authcid) 还是授权身份 (authzid)。身份验证身份由 OAuth 令牌为客户端建立,因此 username 似乎必须是授权身份。
Microsoft 关于共享邮箱的文档明确指出 Office 365 服务器将其解释为授权身份。
尽管它们应该验证令牌是否已授权访问 username 的服务,但某些服务器似乎忽略了此字段,仅依赖于令牌授权的身份和范围。
已授权使用适当的 OAuth2 范围为 username 使用该服务的 OAuth2 访问令牌。
已授权使用适当的 OAuth2 范围为 username 使用该服务的 OAuth2 访问令牌。
从 Google 的原始 XOAUTH2 文档中,尚不清楚 “User” 是指身份验证身份 (authcid) 还是授权身份 (authzid)。身份验证身份由 OAuth 令牌为客户端建立,因此 username 似乎必须是授权身份。
Microsoft 关于共享邮箱的文档明确指出 Office 365 服务器将其解释为授权身份。
尽管它们应该验证令牌是否已授权访问 username 的服务,但某些服务器似乎忽略了此字段,仅依赖于令牌授权的身份和范围。
公共类方法
为 “XOAUTH2” SASL 机制创建一个验证器,如 Google、Microsoft 和 Yahoo 所指定。
属性¶ ↑
-
username— 被访问帐户的用户名。请注意,与某些其他验证器不同,
username设置授权身份,而不是身份验证身份。使用 OAuth 令牌为客户端建立经过身份验证的身份。 -
oauth2_token— 一个 OAuth2.0 访问令牌,已授权为username访问该服务。
任何其他关键字参数都会被静默忽略。
# File net-imap-0.5.4/lib/net/imap/sasl/xoauth2_authenticator.rb, line 71 def initialize(user = nil, token = nil, username: nil, oauth2_token: nil, authzid: nil, secret: nil, **) @username = authzid || username || user or raise ArgumentError, "missing username (authzid)" @oauth2_token = oauth2_token || secret || token or raise ArgumentError, "missing oauth2_token" @done = false end
公共实例方法
当初始客户端响应已发送时返回 true。
除非此方法返回 true,否则身份验证不应成功,但这并不表示成功。
# File net-imap-0.5.4/lib/net/imap/sasl/xoauth2_authenticator.rb, line 98 def done?; @done end
XOAUTH2 可以发送初始客户端响应。
# File net-imap-0.5.4/lib/net/imap/sasl/xoauth2_authenticator.rb, line 84 def initial_response?; true end
返回 XOAUTH2 格式的响应,该响应将 username 与 oauth2_token 组合在一起。
# File net-imap-0.5.4/lib/net/imap/sasl/xoauth2_authenticator.rb, line 88 def process(_data) build_oauth2_string(@username, @oauth2_token) ensure @done = true end
私有实例方法
# File net-imap-0.5.4/lib/net/imap/sasl/xoauth2_authenticator.rb, line 102 def build_oauth2_string(username, oauth2_token) format("user=%s\1auth=Bearer %s\1\1", username, oauth2_token) end