类:Mongo::Auth::Aws::Request Private

继承:
对象
  • 对象
显示全部
定义于:
build/Ruby-driver-v2.19/lib/ mongo /auth/ Amazon Web Services /request.rb

Overview

此类是私有 API 的一部分。 应尽可能避免使用此类,因为它将来可能会被删除或更改。

用于处理Amazon Web Services请求的助手类。

此类的主要用途是生成规范的Amazon Web Services STS 请求并为其计算签名标头和签名。

由于:

  • 2.0.0

常量摘要折叠

STS_REQUEST_BODY =

此常量是私有 API 的一部分。 应尽可能避免使用此常量,因为它将来可能会被删除或更改。

STS GetCallerIdentity请求的正文。

这是目前此类支持发出的唯一请求。

由于:

  • 2.0.0

" Action=GetCallerIdentity&Version= 2011 - 06 - 15 ".冻结
VALIDATE_TIMEOUT =

此常量是私有 API 的一部分。 应尽可能避免使用此常量,因为它将来可能会被删除或更改。

通过 STS凭证的超时时间(以秒为单位)。

由于:

  • 2.0.0

10

实例属性摘要折叠

实例方法摘要折叠

构造函数详情

#initialize (access_key_id:, secret_access_key:, session_token: nil, 托管:, server_nonce:, time: Time.now) ⇒请求

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

注意:

通过覆盖时间,可以创建可重现的请求(换言之,重放请求)。

构造请求。

参数:

  • access_key_id ( string )

    访问密钥 ID。

  • secret_access_key ( string )

    秘密访问密钥。

  • session_token string (默认为: nil

    临时凭证的会话令牌。

  • 主机 ( string )

    要使用的 Host HTTP标头的值。

  • server_nonce ( string )

    服务器随机数二进制string 。

  • 时间 时间 (默认为: Time.now

    请求的时间。

由于:

  • 2.0.0



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_idstring (只读)

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

返回 access_key_id访问权限密钥 ID。

返回:

  • ( string )

    access_key_id访问权限密钥 ID。

由于:

  • 2.0.0



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标头的值。

返回:

  • ( string )

    托管要使用的 Host HTTP标头的值。

由于:

  • 2.0.0



87
88
89
# File 'build/Ruby-driver-v2.19/lib/ mongo /auth/ Amazon Web Services /request.rb', 第87行

def 主机
  @host
end

# secret_access_keystring (只读)

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

返回 secret_access_key 秘密访问密钥。

返回:

  • ( string )

    secret_access_key 秘密访问权限密钥。

由于:

  • 2.0.0



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_noncestring (只读)

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

返回 server_nonce服务器随机数二进制string 。

返回:

  • ( string )

    server_nonce服务器随机数二进制string 。

由于:

  • 2.0.0



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_tokenstring (只读)

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

返回 session_token 临时凭证的会话令牌。

返回:

  • ( string )

    session_token 临时凭证的会话令牌。

由于:

  • 2.0.0



84
85
86
# File 'build/Ruby-driver-v2.19/lib/ mongo /auth/ Amazon Web Services /request.rb', 第84行

def session_token
  @session_token
end

# timeTime (只读)

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

返回 time请求的时间。

返回:

  • 时间

    time请求的时间。

由于:

  • 2.0.0



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 标头的值。

返回:

  • ( string )

    授权标头值。

由于:

  • 2.0.0



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_requeststring

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

返回在计算Amazon Web Services V4 签名时使用的规范请求。

返回:

  • ( string )

    规范请求。

由于:

  • 2.0.0



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_datestring

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

返回请求的 formatted_date YYYYMMDD 格式日期。

返回:

  • ( string )

    formatted_date YYYYMMDD 请求的格式化日期。

由于:

  • 2.0.0



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_timestring

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

返回请求的 formatted_time ISO 8601格式时间,如 X-Amz-Date 标头中使用的时间。

返回:

  • ( string )

    formatted_time ISO 8601格式的请求时间,将在 X-Amz-Date 标头中使用。

由于:

  • 2.0.0



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 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

注意:

并非所有这些标头都是签名标头列表的一部分,哈希的键不一定按字典顺序排序,并且键可以任何大小写形式排序。

返回包含计算出的规范请求标头的哈希值。

返回:

  • ( <Hash> )

    headers 标头。

由于:

  • 2.0.0



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 服务器希望仅对某些标头进行签名,如果对其他标头进行了签名,则不会形成正确的请求。

  • 将所有标头名称小写。

  • 在哈希中按字典顺序对标头进行排序。

返回:

  • ( <Hash> )

    headers 标头。

由于:

  • 2.0.0



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 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

返回区域 派生自主机的主机区域。

返回:

  • ( string )

    地区托管的地区,派生自托管。

由于:

  • 2.0.0



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 规范,返回请求的范围。

返回:

  • ( string )

    范围。

由于:

  • 2.0.0



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 规范,返回规范请求的计算签名。

返回:

  • ( string )

    签名。

由于:

  • 2.0.0



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_stringstring

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

根据Amazon Web Services签名 V4 规范,返回以分号分隔的签名标头名称列表。

返回:

  • ( string )

    已签名标头列表。

由于:

  • 2.0.0



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请求来验证凭证和构建的请求组件。

返回:

  • (哈希)

    GetCallerIdentity 结果。

由于:

  • 2.0.0



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')
      aws_message = 有效负载.获取(' Error ').获取(' Message ')
      msg = " Credential check for user #{ access_key_id } failed with HTTP status code #{ resp . code } : #{ aws_code } : #{ aws_message } "
      msg += '  ' 除非 msg.end_with?('  ')
      msg += "请检查凭证是否有效,如果是临时凭证(即使用会话令牌),则确保已提供会话令牌且未过期"
      提高 错误::CredentialCheckError, msg
    end
    有效负载.获取(' GetCallerIdentityResponse ').获取(' GetCallerIdentityResult ')
  end
end