Classe: Mongo::Auth::Aws::Request Private

Herda:
Objeto
  • Objeto
mostrar tudo
Definido em:
lib/mongo/auth/Amazon Web Services/request.rb

Visão geral

Esta classe faz parte de uma API privada. Evite usar essa classe, se possível, pois ela pode ser removida ou alterada no futuro.

classe auxiliar para trabalhar com solicitações Amazon Web Services .

O objetivo principal desta classe é produzir a solicitação canônica do Amazon Web Services STS e calcular os cabeçalhos assinados e a assinatura para ela.

Desde:

  • 2.0.0

Colapsode resumo constante

STS_REQUEST_BODY =

Essa constante faz parte de uma API privada. Você deve evitar usar essa constante, se possível, pois ela pode ser removida ou alterada no futuro.

O corpo da solicitação STS GetCallerIdentity.

Atualmente, esta é a única solicitação que esta classe suporta fazer.

Desde:

  • 2.0.0

'Action=GetCallerIdentity&Version=2011-06-15'
VALIDATE_TIMEOUT =

Essa constante faz parte de uma API privada. Você deve evitar usar essa constante, se possível, pois ela pode ser removida ou alterada no futuro.

O timeout, em segundos, a ser usado para validar credenciais via STS.

Desde:

  • 2.0.0

10

Recolhimento do Resumo do atributo de instância

Recolhimento do Resumo do método de instância

Detalhes do construtor

#initialize(access_key_id:, secret_access_key:, host:, server_nonce:, session_token: nil, time: Time.now) ⇒ solicitação

Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.

Observação:

Ao substituir o tempo, é possível criar solicitações reproduzíveis (em outras palavras, reproduzir uma solicitação).

Constrói a solicitação.

Parâmetros:

  • access_key_id (string)

    O ID da chave de acesso.

  • secret_access_key (string)

    A chave de acesso secreta.

  • session_token (string) (padrão para: nil)

    O token da sessão para credenciais temporárias.

  • Anfitrião (string)

    O valor do cabeçalho HTTP do Host a ser usado.

  • server_nonce (string)

    A string binária do servidor .

  • time (Hora) (padrão para: Time. now)

    A hora da solicitação.

Aumenta:

Desde:

  • 2.0.0



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# Arquivo 'lib/mongo/auth/Amazon Web Services/request.rb', linha 51

def inicializar(access_key_id:, secret_access_key:, host:, server_nonce:, session_token: nada, tempo: Hora.agora)
  @access_key_id = access_key_id
  @secret_access_key = secret_access_key
  @session_token = session_token
  @host = Anfitrião
  @server_nonce = server_nonce
  @time = time

  %i[access_key_id secret_access_key Anfitrião server_nonce].cada fazer |arg|
    valor = instance_variable_get("@#{arg}")
    aumentar Erro::InvalidServerAuthResponse, "O valor para '#{arg}' é obrigatório" se valor.nada? || valor.vazio?
  end

  Método a menos que Anfitrião && Anfitrião.Tamanho > 255

  aumentar Erro::InvalidServerAuthHost, "O valor para 'host' é muito longo: #{@host}"
end

Detalhes do atributo da instância

#access_key_id ➤ string (somente leitura)

Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.

Retorna access_key_id O ID da chave de acesso.

Retorna:

  • (string)

    access_key_id A ID da chave de acesso.

Desde:

  • 2.0.0



70
71
72
# Arquivo 'lib/mongo/auth/Amazon Web Services/request.rb', linha 70

def access_key_id
  @access_key_id
end

#hoststring (somente leitura)

Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.

Retorna host O valor do cabeçalho HTTP Host a ser usado.

Retorna:

  • (string)

    host O valor do cabeçalho HTTP do Host a ser usado.

Desde:

  • 2.0.0



80
81
82
# Arquivo 'lib/mongo/auth/Amazon Web Services/request.rb', linha 80

def Anfitrião
  @host
end

#secret_access_key ➤ string (readonly)

Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.

Retorna secret_access_key A chave de acesso secreta.

Retorna:

  • (string)

    secret_access_key A chave de acesso secreta.

Desde:

  • 2.0.0



73
74
75
# Arquivo 'lib/mongo/auth/Amazon Web Services/request.rb', linha 73

def secret_access_key
  @secret_access_key
end

#server_noncestring (readonly)

Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.

Retorna server_nonce A string binária do servidor nonce.

Retorna:

  • (string)

    server_nonce A string binária do servidor nonce.

Desde:

  • 2.0.0



83
84
85
# Arquivo 'lib/mongo/auth/Amazon Web Services/request.rb', linha 83

def server_nonce
  @server_nonce
end

#session_token token string (somente leitura)

Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.

Retorna session_token O token de sessão para credenciais temporárias.

Retorna:

  • (string)

    session_token O token de sessão para credenciais temporárias.

Desde:

  • 2.0.0



77
78
79
# Arquivo 'lib/mongo/auth/Amazon Web Services/request.rb', linha 77

def session_token
  @session_token
end

#timeTime (somente leitura)

Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.

Retorna hora A hora da solicitação.

Retorna:

  • (Tempo)

    time A hora da solicitação.

Desde:

  • 2.0.0



86
87
88
# Arquivo 'lib/mongo/auth/Amazon Web Services/request.rb', linha 86

def time
  @time
end

Detalhes do método de instância

#autorizaçãostring

Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.

Retorna o valor do cabeçalho de autorização, de acordo com a especificação V4 de assinatura do Amazon Web Services .

Retorna:

  • (string)

    Valor do cabeçalho de autorização.

Desde:

  • 2.0.0



220
221
222
# Arquivo 'lib/mongo/auth/Amazon Web Services/request.rb', linha 220

def Autorização
  "Amazon Web Services4-HMAC-SHA256 Credential=#{access_key_id}/#{scope}, SignedHeaders=#{subscribed_headers_string}, Signature=#{signature}"
end

#canonical_requeststring

Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.

Retorna a solicitação canônica usada durante o cálculo da assinatura do Amazon Web Services V4 .

Retorna:

  • (string)

    O pedido canônico.

Desde:

  • 2.0.0



181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
# Arquivo 'lib/mongo/auth/Amazon Web Services/request.rb', linha 181

def canonical_request
  cabeçalhos = headers_to_sign
  serialized_headers = cabeçalhos.map fazer |k, v|
    "#{k}:#{v}"
  end.juntar("\n")
  hashed_ payload = Digest::SHA256.Novo.update(STS_REQUEST_BODY).hexdigest
  "POST\n/\n\n" +
    # Há duas novas linhas após os cabeçalhos serializados porque o
    # assinatura V4 especificação trata cada cabeçalho como contendo o
    # encerrando a nova linha e há uma nova linha adicional
    # separando os cabeçalhos dos nomes dos cabeçalhos assinados.
    "#{serialized_headers}\n\n" +
    "#{subscribed_headers_string}\n" +
    hashed_ payload
end

#formatted_datestring

Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.

Retorna formatted_date AAMMDD a data formatada da solicitação.

Retorna:

  • (string)

    formatted_date AAAAMMDD data formatada da solicitação.

Desde:

  • 2.0.0



95
96
97
# Arquivo 'lib/mongo/auth/Amazon Web Services/request.rb', linha 95

def formatted_date
  formatted_time[0, 8]
end

#formatted_timestring

Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.

Retorna formatted_time ISO8601-hora formatada da solicitação, como seria usado no cabeçalho X-Amz-Date.

Retorna:

  • (string)

    formatted_time ISO8601-hora formatada da solicitação, como seria usada no cabeçalho X-Amz-Date.

Desde:

  • 2.0.0



90
91
92
# Arquivo 'lib/mongo/auth/Amazon Web Services/request.rb', linha 90

def formatted_time
  @formatted_time ||= @time.getutc.strftime('%Y%m%dT%H%M%SZ')
end

#cabeçalhos<Hash>

Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.

Observação:

Nem todos esses cabeçalhos fazem parte da lista de cabeçalhos assinados, as chaves do hash não são necessariamente ordenadas lexicograficamente e as chaves podem estar em qualquer caso.

Retorna o hash contendo os cabeçalhos da solicitação canônica calculada.

Retorna:

  • (<Hash>)

    cabeçalhos Os cabeçalhos.

Desde:

  • 2.0.0



134
135
136
137
138
139
140
141
142
143
144
145
# Arquivo 'lib/mongo/auth/Amazon Web Services/request.rb', linha 134

def cabeçalhos
  cabeçalhos = {
    'comprimento do conteúdo' => STS_REQUEST_BODY.Tamanho.to_s,
    'content-type' => 'aplicação/x-www-form-urtencoded',
    'anfitrião' => Anfitrião,
    'x-amz-date' => formatted_time,
    'x-mongodb-gs2-cb-lag' => 'n',
    'x-mongodb-server-nonce' => Base64.codificar64(server_nonce).excluir("\n"),
  }
  cabeçalhos['x-amz-security-token'] = session_token se session_token
  cabeçalhos
end

#headers_to_sign<Hash>

Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.

Retorna o hash contendo os cabeçalhos da solicitação canônica calculada que deve ser assinada, em um formato pronto para assinar.

A diferença entre #headers e este método é este método:

  • Remove todos os cabeçalhos que não devem ser assinados. De acordo com as especificações Amazon Web Services , deve ser possível assinar todos os cabeçalhos, mas o servidor MongoDB espera que apenas alguns cabeçalhos sejam assinados e não formará a solicitação correta se outros cabeçalhos forem assinados.
  • Reduz todos os nomes de cabeçalho.
  • Ordena os cabeçalhos lexicograficamente no hash.

Retorna:

  • (<Hash>)

    cabeçalhos Os cabeçalhos.

Desde:

  • 2.0.0



160
161
162
163
164
165
166
167
# Arquivo 'lib/mongo/auth/Amazon Web Services/request.rb', linha 160

def headers_to_sign
  headers_to_sign = {}
  cabeçalhos.keys.sort_by { |k| k.downcase }.cada fazer |chave|
    write_key = chave.downcase
    headers_to_sign[write_key] = cabeçalhos[chave]
  end
  headers_to_sign
end

#regiãostring

Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.

Retorna a região A região do host, derivada do host.

Retorna:

  • (string)

    região A região do host, derivada do host.

Aumenta:

Desde:

  • 2.0.0



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# Arquivo 'lib/mongo/auth/Amazon Web Services/request.rb', linha 100

def região
  # Caso comum
  Método 'us-east-1' se Anfitrião == 'sts.amazonaws.com'

  aumentar Erro::InvalidServerAuthHost, "O host começa com um período: #{host}" se Anfitrião.start_with?('.')
  aumentar Erro::InvalidServerAuthHost, "O host termina com um período: #{host}" se Anfitrião.end_with?('.')

  peças = Anfitrião.dividir('.')
  se peças.algum? { |parte| parte.vazio? }
    aumentar Erro::InvalidServerAuthHost, "O host tem um componente vazio: #{host}"
  end

  se peças.Tamanho == 1
    'us-east-1'
  mais
    peças[1]
  end
end

#scopestring

Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.

Retorna o escopo da solicitação, de acordo com a especificação V4 de assinatura do Amazon Web Services .

Retorna:

  • (string)

    O escopo.

Desde:

  • 2.0.0



122
123
124
# Arquivo 'lib/mongo/auth/Amazon Web Services/request.rb', linha 122

def escopo
  "#{formatted_date}/#{region}/sts/Amazon Web Services4_request"
end

#assinaturastring

Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.

Retorna a assinatura calculada da solicitação canônica, de acordo com a especificação V4 de assinatura do Amazon Web Services .

Retorna:

  • (string)

    A assinatura.

Desde:

  • 2.0.0



201
202
203
204
205
206
207
208
209
210
211
212
213
214
# Arquivo 'lib/mongo/auth/Amazon Web Services/request.rb', linha 201

def assinatura
  hashed_canonical_request = Digest::SHA256.hexdigest(canonical_request)
  string_to_sign = "Amazon Web Services4-HMAC-SHA256\n" +
                   "#{formatted_time}\n" +
                   "#{scope}\n" +
                   hashed_canonical_request
  # Todas as operações HMAC intermediárias não são codificadas em hexadecimal.
  Mac = hmac("Amazon Web Services4#{secret_access_key}", formatted_date)
  Mac = hmac(Mac, região)
  Mac = hmac(Mac, 'sts')
  signature_key = hmac(Mac, 'Amazon Web Services4_request')
  # Somente a operação HMAC final é codificada em hexadecimal.
  hmac_hex(signature_key, string_to_sign)
end

#subscribed_headers_string ➤ string

Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.

Retorna uma lista de nomes de cabeçalhos assinados separados por ponto e vírgula, de acordo com a especificação V4 de assinatura do Amazon Web Services .

Retorna:

  • (string)

    A lista de cabeçalhos assinados.

Desde:

  • 2.0.0



173
174
175
# Arquivo 'lib/mongo/auth/Amazon Web Services/request.rb', linha 173

def subscribed_headers_string
  headers_to_sign.keys.juntar(';')
end

#validate!Hash

Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.

Valida as credenciais e os componentes de solicitação construídos enviando uma solicitação real de STS GetCallerIdentity.

Retorna:

  • (Hash)

    Resultado GetCallerIdentity.

Desde:

  • 2.0.0



228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
# Arquivo 'lib/mongo/auth/Amazon Web Services/request.rb', linha 228

def validar!
  sts_request = Líquido::HTTP::Postar.Novo("https://#{host}").toque fazer |req|
    cabeçalhos.cada fazer |k, v|
      req[k] = v
    end
    req['autorização'] = Autorização
    req['aceitar'] = 'aplicação/JSON'
    req.corpo, corpo = STS_REQUEST_BODY
  end
  HTTP = Líquido::HTTP.Novo(Anfitrião, 443)
  HTTP.use_ssl = true
  HTTP.iniciar fazer
    res = Tempo-limite.timeout(VALIDATE_TIMEOUT, Erro::CredentialCheckError,
                           'A solicitação de GetCallerIdentity expirou') fazer
      HTTP.Solicitar(sts_request)
    end
    Carga útil = JSON.parse(res.corpo, corpo)
    se res.código != '200'
      aws_code = Carga útil.buscar('Erro').buscar('Code')
      aws_message = Carga útil.buscar('Erro').buscar('Mensagem')
      mensagem = "A verificação de credenciais do usuário #{access_key_id}  falhou com o código de status HTTP #{res.code}: #{aws_code}: #{aws_message} "
      mensagem += '.' a menos que mensagem.end_with?('.')
      mensagem += ' Verifique se as credenciais são válidas e, se forem temporárias (ou seja, use o token de sessão), se o token de sessão é fornecido e não expirou'
      aumentar Erro::CredentialCheckError, mensagem
    end
    Carga útil.buscar('GetCallerIdentityResponse').buscar('GetCallerIdentityResult')
  end
end