类:Mongo::Auth::Aws::Request Private
- 继承:
-
对象
- 对象
- Mongo::Auth::Aws::Request
- 定义于:
- build/Ruby-driver-v2.19/lib/ mongo /auth/ Amazon Web Services /request.rb
Overview
此类是私有 API 的一部分。 应尽可能避免使用此类,因为它将来可能会被删除或更改。
用于处理Amazon Web Services请求的助手类。
此类的主要用途是生成规范的Amazon Web Services STS 请求并为其计算签名标头和签名。
常量摘要折叠
- STS_REQUEST_BODY =
此常量是私有 API 的一部分。 应尽可能避免使用此常量,因为它将来可能会被删除或更改。
STS GetCallerIdentity请求的正文。
这是目前此类支持发出的唯一请求。
" Action=GetCallerIdentity&Version= 2011 - 06 - 15 ".冻结
- VALIDATE_TIMEOUT =
此常量是私有 API 的一部分。 应尽可能避免使用此常量,因为它将来可能会被删除或更改。
通过 STS凭证的超时时间(以秒为单位)。
10
实例属性摘要折叠
-
#access_key_id ⇒ String
只读
private
Access_key_id 访问密钥 ID。
-
#主机⇒ string
只读
private
主机 要使用的主机HTTP标头的值。
-
# secret_access_key ⇒ string
只读
private
Secret_access_key 秘密访问密钥。
-
# server_nonce ⇒ string
只读
private
Server_nonce服务器随机数二进制string 。
-
#session_token ⇒ String
只读
private
Session_token 临时凭证的会话令牌。
-
# time ⇒ 时间
只读
private
时间 请求的时间。
实例方法摘要折叠
-
#授权⇒ string
private
根据Amazon Web Services签名 V4 规范,返回 Authorization 标头的值。
-
# canonical_request ⇒ string
private
返回在计算Amazon Web Services V4 签名时使用的规范请求。
-
# formatted_date ⇒ string
private
Formatted_date YYYYMMDD请求的格式化日期。
-
# formatted_time ⇒ string
private
Formatted_time ISO 8601格式的请求时间,将在 X-Amz-Date 标头中使用。
-
# headers ⇒ <Hash>
private
返回包含计算出的规范请求标头的哈希值。
-
# headers_to_sign ⇒ <Hash>
private
以准备签名的形式返回包含计算出的应签名的规范请求标头的哈希值。
-
#initialize (access_key_id:, secret_access_key:, session_token: nil, host:, server_nonce:, time: Time.now) ⇒ 请求
构造函数
private
构造请求。
-
#区域⇒ string
private
地区托管的地区,源自托管。
-
#作用域⇒ string
private
根据Amazon Web Services签名 V4 规范,返回请求的范围。
-
#签名⇒ string
private
根据Amazon Web Services签名 V4 规范,返回规范请求的计算签名。
-
# Signed_headers_string ⇒ string
private
根据Amazon Web Services签名 V4 规范,返回以分号分隔的签名标头名称列表。
-
#validate! ⇒ Hash
private
通过发送真实的 STS GetCallerIdentity请求来验证凭证和构建的请求组件。
构造函数详情
#initialize (access_key_id:, secret_access_key:, session_token: nil, 托管:, server_nonce:, time: Time.now) ⇒请求
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
通过覆盖时间,可以创建可重现的请求(换言之,重放请求)。
构造请求。
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'build/Ruby-driver-v2.19/lib/ mongo /auth/ Amazon Web Services /request.rb', 第54行 def 初始化(access_key_id:, secret_access_key:, session_token: nil, 主机:, server_nonce:, 时间: 时间.now ) @access_key_id = access_key_id @secret_access_key = secret_access_key @session_token = session_token @host = 主机 @server_nonce = server_nonce @time = 时间 %i(access_key_id secret_access_key 主机 server_nonce).每 do |arg| 值 = instance_variable_get(" @ #{ arg } ") if 值.nil? || 值.空? 提高 错误::InvalidServerAuthResponse, " ' #{ arg } ' 的值是必需的" end end if 主机 && 主机.长度 > 255 提高 错误::InvalidServerAuthHost, " ' 托管' 的值太长: #{ 托管 } " end end |
实例属性详细信息
# access_key_id ⇒ string (只读)
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
返回 access_key_id访问权限密钥 ID。
77 78 79 |
# File 'build/Ruby-driver-v2.19/lib/ mongo /auth/ Amazon Web Services /request.rb', 第77行 def access_key_id @access_key_id end |
#主机⇒ string (只读)
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
返回托管要使用的 Host HTTP标头的值。
87 88 89 |
# File 'build/Ruby-driver-v2.19/lib/ mongo /auth/ Amazon Web Services /request.rb', 第87行 def 主机 @host end |
# secret_access_key ⇒ string (只读)
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
返回 secret_access_key 秘密访问密钥。
80 81 82 |
# File 'build/Ruby-driver-v2.19/lib/ mongo /auth/ Amazon Web Services /request.rb', 第80行 def secret_access_key @secret_access_key end |
# server_nonce ⇒ string (只读)
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
返回 server_nonce服务器随机数二进制string 。
90 91 92 |
# File 'build/Ruby-driver-v2.19/lib/ mongo /auth/ Amazon Web Services /request.rb', 第90行 def server_nonce @server_nonce end |
# session_token ⇒ string (只读)
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
返回 session_token 临时凭证的会话令牌。
84 85 86 |
# File 'build/Ruby-driver-v2.19/lib/ mongo /auth/ Amazon Web Services /request.rb', 第84行 def session_token @session_token end |
# time ⇒ Time (只读)
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
返回 time请求的时间。
93 94 95 |
# File 'build/Ruby-driver-v2.19/lib/ mongo /auth/ Amazon Web Services /request.rb', 第93行 def 时间 @time end |
实例方法详细信息
#授权⇒ string
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
根据Amazon Web Services签名 V4 规范,返回 Authorization 标头的值。
235 236 237 |
# File 'build/Ruby-driver-v2.19/lib/ mongo /auth/ Amazon Web Services /request.rb', 第235行 def " Amazon Web Services 4-HMAC-SHA256 Credential= #{ access_key_id } / #{ scope } , Signedheaders= #{ Signed_headers_string } , Signature= #{ signature } " end |
# canonical_request ⇒ string
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
返回在计算Amazon Web Services V4 签名时使用的规范请求。
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
# File 'build/Ruby-driver-v2.19/lib/ mongo /auth/ Amazon Web Services /request.rb', 第196行 def canonical_request headers = headers_to_sign Serialized_headers = headers.map do |k, v| " #{ k } : #{ v } " end.连接 (JOIN)(" \n ") hashed_payload = 摘要::SHA256.new.update(STS_REQUEST_BODY).hexdigest " POST\n/\n\n " + # 序列化标头后有两个换行符,因为 # 签名 V 4规范将每个标头视为包含 # 终止换行符,并且有一个额外的换行符 # 将标头与签名标头名称分开。 " #{ serialized_headers } \n\n " + " #{ Signed_headers_string } \n " + hashed_payload end |
# formatted_date ⇒ string
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
返回请求的 formatted_date YYYYMMDD 格式日期。
102 103 104 |
# File 'build/Ruby-driver-v2.19/lib/ mongo /auth/ Amazon Web Services /request.rb', 第102行 def formatted_date formatted_time[0, 8] end |
# formatted_time ⇒ string
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
返回请求的 formatted_time ISO 8601格式时间,如 X-Amz-Date 标头中使用的时间。
97 98 99 |
# File 'build/Ruby-driver-v2.19/lib/ mongo /auth/ Amazon Web Services /request.rb', 第97行 def formatted_time @formatted_time ||= @time.getutc.strftime(' %Y%m%dT%H%M%SZ ') end |
# headers ⇒ <Hash>
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
并非所有这些标头都是签名标头列表的一部分,哈希的键不一定按字典顺序排序,并且键可以任何大小写形式排序。
返回包含计算出的规范请求标头的哈希值。
147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
# File 'build/Ruby-driver-v2.19/lib/ mongo /auth/ Amazon Web Services /request.rb', 第147行 def headers headers = { ' Content-Length ' => STS_REQUEST_BODY.长度.to_s, 'content-type' => ' 应用程序/x-www-form-urlencoded ', ' 托管 ' => 主机, 'x-amz-date' => formatted_time, ' x-mongodb-gs 2 -cb-flag ' => 'n', ' x-mongodb-server-nonce ' => Base64.对64进行编码(server_nonce).gsub(" \n ", ' '), } if session_token headers[' x-amz-security-token '] = session_token end headers end |
#headers_to_sign ⇒ <Hash>
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
以准备签名的形式返回包含计算出的应签名的规范请求标头的哈希值。
#headers 和此方法的区别在于:
-
删除任何不需要签名的标头。 根据Amazon Web Services规范,应该可以对所有标头进行签名,但MongoDB 服务器希望仅对某些标头进行签名,如果对其他标头进行了签名,则不会形成正确的请求。
-
将所有标头名称小写。
-
在哈希中按字典顺序对标头进行排序。
175 176 177 178 179 180 181 182 |
# File 'build/Ruby-driver-v2.19/lib/ mongo /auth/ Amazon Web Services /request.rb', 第175行 def headers_to_sign headers_to_sign = {} headers.密钥.sort_by { |k| k.Downcase }.每 do |key| write_key = key.Downcase headers_to_sign[write_key] = headers[key] end headers_to_sign end |
#地区⇒ string
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
返回区域 派生自主机的主机区域。
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
# File 'build/Ruby-driver-v2.19/lib/ mongo /auth/ Amazon Web Services /request.rb', 第107行 def 区域 # 常见情况 if 主机 == 'sts.amazonaws.com' return ' us-east- 1 ' end if 主机.start_with?(' 。 ') 提高 错误::InvalidServerAuthHost, " Host 以句点开头: #{ 托管 } " end if 主机.end_with?(' 。 ') 提高 错误::InvalidServerAuthHost, " Host以句点结尾: #{ host } " end 零件 = 主机.拆分(' 。 ') if 零件.任何? { |部分| 部分.空? } 提高 错误::InvalidServerAuthHost, "主机有一个空组件: #{ 托管 } " end if 零件.长度 == 1 ' us-east- 1 ' else 零件[1] end end |
#作用域⇒ string
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
根据Amazon Web Services签名 V4 规范,返回请求的范围。
135 136 137 |
# File 'build/Ruby-driver-v2.19/lib/ mongo /auth/ Amazon Web Services /request.rb', 第135行 def 范围 " #{ formatted_date } / #{ 地区 } /sts/ Amazon Web Services 4_request " end |
#签名⇒ string
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
根据Amazon Web Services签名 V4 规范,返回规范请求的计算签名。
216 217 218 219 220 221 222 223 224 225 226 227 228 229 |
# File 'build/Ruby-driver-v2.19/lib/ mongo /auth/ Amazon Web Services /request.rb', 第216行 def 签名 hashed_canonical_request = 摘要::SHA256.hexdigest(canonical_request) string_to_sign = " Amazon Web Services 4-HMAC-SHA256\n " + " #{ formatted_time } \n " + " #{ scope } \n " + hashed_canonical_request # 并非所有中间 HMAC 操作都经过十六进制编码。 Mac = hmac(" Amazon Web Services 4 #{ secret_access_key } ", formatted_date) Mac = hmac(Mac, 区域) Mac = hmac(Mac, ' sts ') signing_key = hmac(Mac, ' Amazon Web Services 4_request ') # 仅对最终的 HMAC 操作进行十六进制编码。 hmac_hex(signing_key, string_to_sign) end |
# Signed_headers_string ⇒ string
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
根据Amazon Web Services签名 V4 规范,返回以分号分隔的签名标头名称列表。
188 189 190 |
# File 'build/Ruby-driver-v2.19/lib/ mongo /auth/ Amazon Web Services /request.rb', 第188行 def Signed_headers_string headers_to_sign.密钥.连接 (JOIN)(';') end |
#validate! ⇒ Hash
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
通过发送真实的 STS GetCallerIdentity请求来验证凭证和构建的请求组件。
243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 |
# File 'build/Ruby-driver-v2.19/lib/ mongo /auth/ Amazon Web Services /request.rb', 第243行 def validate! sts_request = 网络::HTTP::发布.new(" https:// #{ 托管 } ").点击 do |req| headers.每 do |k, v| req[k] = v end req[' 授权 '] = req[' accept '] = ' 应用程序/ JSON ' req.body = STS_REQUEST_BODY end HTTP = 网络::HTTP.new(主机, 443) HTTP.use_ssl = true HTTP.开始 do resp = 超时.超时(VALIDATE_TIMEOUT, 错误::CredentialCheckError, ' GetCallerIdentity请求超时') do HTTP.请求(sts_request) end 有效负载 = JSON.parse(resp.body) if resp.代码 != '200' aws_code = 有效负载.获取(' Error ').获取('Code') = 有效负载.获取(' Error ').获取(' Message ') msg = " Credential check for user #{ access_key_id } failed with HTTP status code #{ resp . code } : #{ aws_code } : #{ } " msg += ' 。 ' 除非 msg.end_with?(' 。 ') msg += "请检查凭证是否有效,如果是临时凭证(即使用会话令牌),则确保已提供会话令牌且未过期" 提高 错误::CredentialCheckError, msg end 有效负载.获取(' GetCallerIdentityResponse ').获取(' GetCallerIdentityResult ') end end |