@@ -14,13 +14,20 @@ module SASL
14
14
class OAuthAuthenticator
15
15
include GS2Header
16
16
17
- # Authorization identity: an identity to act as or on behalf of.
17
+ # Authorization identity: an identity to act as or on behalf of. The
18
+ # identity form is application protocol specific. If not provided or
19
+ # left blank, the server derives an authorization identity from the
20
+ # authentication identity. The server is responsible for verifying the
21
+ # client's credentials and verifying that the identity it associates
22
+ # with the client's authentication identity is allowed to act as (or on
23
+ # behalf of) the authorization identity.
24
+ #
25
+ # For example, an administrator or superuser might take on another role:
26
+ #
27
+ # imap.authenticate "PLAIN", "root", passwd, authzid: "user"
18
28
#
19
- # If no explicit authorization identity is provided, it is usually
20
- # derived from the authentication identity. For the OAuth-based
21
- # mechanisms, the authentication identity is the identity established by
22
- # the OAuth credential.
23
29
attr_reader :authzid
30
+ alias username authzid
24
31
25
32
# Hostname to which the client connected.
26
33
attr_reader :host
@@ -39,6 +46,7 @@ class OAuthAuthenticator
39
46
40
47
# The query string. (optional)
41
48
attr_reader :qs
49
+ alias query qs
42
50
43
51
# Stores the most recent server "challenge". When authentication fails,
44
52
# this may hold information about the failure reason, as JSON.
@@ -47,29 +55,39 @@ class OAuthAuthenticator
47
55
# Creates an RFC7628[https://tools.ietf.org/html/rfc7628] OAuth
48
56
# authenticator.
49
57
#
50
- # === Options
58
+ # ==== Parameters
59
+ #
60
+ # See child classes for required parameter(s). The following parameters
61
+ # are all optional, but it is worth noting that <b>application protocols
62
+ # are allowed to require</b> #authzid (or other parameters, such as
63
+ # #host or #port) <b>as are specific server implementations</b>.
51
64
#
52
- # See child classes for required configuration parameter(s). The
53
- # following parameters are all optional, but protocols or servers may
54
- # add requirements for #authzid, #host, #port, or any other parameter.
65
+ # * _optional_ #authzid ― Authorization identity to act as or on behalf of.
66
+ # * _optional_ #username — An alias for #authzid.
55
67
#
56
- # * #authzid ― Identity to act as or on behalf of.
57
- # * #host — Hostname to which the client connected.
58
- # * #port — Service port to which the client connected.
59
- # * #mthd — HTTP method
60
- # * #path — HTTP path data
61
- # * #post — HTTP post data
62
- # * #qs — HTTP query string
68
+ # Note that, unlike some other authenticators, the +username+ keyword
69
+ # parameter sets the authorization identity and not the authentication
70
+ # identity. The authenticated identity is established with the OAuth
71
+ # token.
72
+ # * _optional_ #host — Hostname to which the client connected.
73
+ # * _optional_ #port — Service port to which the client connected.
74
+ # * _optional_ #mthd — HTTP method
75
+ # * _optional_ #path — HTTP path data
76
+ # * _optional_ #post — HTTP post data
77
+ # * _optional_ #qs — HTTP query string
78
+ # * _optional_ #query — An alias for #qs
63
79
#
80
+ # Any other keyword parameters are quietly ignored.
64
81
def initialize ( authzid : nil , host : nil , port : nil ,
82
+ username : nil , query : nil ,
65
83
mthd : nil , path : nil , post : nil , qs : nil , **)
66
- @authzid = authzid
84
+ @authzid = authzid || username
67
85
@host = host
68
86
@port = port
69
87
@mthd = mthd
70
88
@path = path
71
89
@post = post
72
- @qs = qs
90
+ @qs = qs || query
73
91
@done = false
74
92
end
75
93
@@ -116,32 +134,45 @@ def authorization; raise "must be implemented by subclass" end
116
134
# the bearer token.
117
135
class OAuthBearerAuthenticator < OAuthAuthenticator
118
136
119
- # An OAuth2 bearer token, generally the access token.
137
+ # An OAuth 2.0 bearer token. See {RFC-6750}[https://www.rfc-editor.org/rfc/rfc6750]
120
138
attr_reader :oauth2_token
121
139
122
140
# :call-seq:
123
- # new(oauth2_token, **options) -> authenticator
124
- # new(oauth2_token:, **options) -> authenticator
141
+ # new(oauth2_token:, authzid: nil, host: nil, port: nil, **options) -> authenticator
142
+ # new(oauth2_token:, username: nil, host: nil, port: nil, **options) -> authenticator
143
+ # new(oauth2_token, authzid: nil, host: nil, port: nil, **options) -> authenticator
144
+ # new(authzid, oauth2_token, host: nil, port: nil, **options) -> authenticator
125
145
#
126
146
# Creates an Authenticator for the "+OAUTHBEARER+" SASL mechanism.
127
147
#
128
148
# Called by Net::IMAP#authenticate and similar methods on other clients.
129
149
#
130
- # === Options
150
+ # ==== Parameters
151
+ #
152
+ # * #oauth2_token — An OAuth2 bearer token
153
+ #
154
+ # All other keyword parameters are passed to
155
+ # {super}[rdoc-ref:OAuthAuthenticator::new]. The most common ones are:
156
+ #
157
+ # * _optional_ #authzid ― Authorization identity to act as or on behalf of.
158
+ # * _optional_ #username — An alias for #authzid.
131
159
#
132
- # Only +oauth2_token+ is required by the mechanism, however protocols
133
- # and servers may add requirements for #authzid, #host, #port, or any
134
- # other parameter.
160
+ # Note that, unlike some other authenticators, the +username+ keyword
161
+ # parameter sets the authorization identity and not the authentication
162
+ # identity. The authenticated identity is established for the client
163
+ # with the #oauth2_token.
164
+ # * _optional_ #host — Hostname to which the client connected.
165
+ # * _optional_ #port — Service port to which the client connected.
135
166
#
136
- # * #oauth2_token — An OAuth2 bearer token or access token. *Required.*
137
- # May be provided as either regular or keyword argument.
138
- # * #authzid ― Identity to act as or on behalf of.
139
- # * #host — Hostname to which the client connected.
140
- # * #port — Service port to which the client connected.
141
- # * See OAuthAuthenticator documentation for less common parameters.
167
+ # Only +oauth2_token+ is required by this mechanism, but it is worth
168
+ # noting that <b>application protocols are allowed to require</b>
169
+ # #authzid (or other parameters, such as #host or #port) <b>as are
170
+ # specific server implementations</b>.
142
171
#
143
- def initialize ( oauth2_token_arg = nil , oauth2_token : nil , **args , &blk )
144
- super ( **args , &blk ) # handles authzid, host, port, etc
172
+ # See OAuthAuthenticator documentation for other parameters.
173
+ def initialize ( arg1 = nil , arg2 = nil , oauth2_token : nil , **args , &blk )
174
+ username , oauth2_token_arg = arg2 . nil? ? [ nil , arg1 ] : [ arg1 , arg2 ]
175
+ super ( username : username , **args , &blk )
145
176
oauth2_token && oauth2_token_arg and
146
177
raise ArgumentError , "conflicting values for oauth2_token"
147
178
@oauth2_token = oauth2_token || oauth2_token_arg or
0 commit comments