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

Herda:
Objeto
  • Objeto
mostrar tudo
Definido em:
build/ruby-driver-v2.19/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".congelar
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:, session_token: nil, host:, server_nonce:, time: Time. now) ➤ Request

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.

Desde:

  • 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', linha 54

def inicializar(access_key_id:, secret_access_key:, session_token: nada,
  host:, server_nonce:, 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}")
    se valor.nada? || valor.vazio?
      aumentar Erro::InvalidServerAuthResponse, "O valor para '#{arg}' é obrigatório"
    end
  end

  se Anfitrião && Anfitrião.Tamanho > 255
      aumentar Erro::InvalidServerAuthHost, "O valor para 'host' é muito longo: #{@host}"
  end
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



77
78
79
# File 'build/ruby-driver-v2.19/lib/mongo/auth/Amazon Web Services/request.rb', linha 77

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



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

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



80
81
82
# File 'build/ruby-driver-v2.19/lib/mongo/auth/Amazon Web Services/request.rb', linha 80

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



90
91
92
# File 'build/ruby-driver-v2.19/lib/mongo/auth/Amazon Web Services/request.rb', linha 90

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



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

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



93
94
95
# File 'build/ruby-driver-v2.19/lib/mongo/auth/Amazon Web Services/request.rb', linha 93

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



235
236
237
# File 'build/ruby-driver-v2.19/lib/mongo/auth/Amazon Web Services/request.rb', linha 235

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



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', linha 196

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



102
103
104
# File 'build/ruby-driver-v2.19/lib/mongo/auth/Amazon Web Services/request.rb', linha 102

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



97
98
99
# File 'build/ruby-driver-v2.19/lib/mongo/auth/Amazon Web Services/request.rb', linha 97

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



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', linha 147

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).gsub("\n", ''),
  }
  se session_token
    cabeçalhos['x-amz-security-token'] = session_token
  end
  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



175
176
177
178
179
180
181
182
# File 'build/ruby-driver-v2.19/lib/mongo/auth/Amazon Web Services/request.rb', linha 175

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.

Desde:

  • 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', linha 107

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

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

  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



135
136
137
# File 'build/ruby-driver-v2.19/lib/mongo/auth/Amazon Web Services/request.rb', linha 135

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



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', linha 216

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



188
189
190
# File 'build/ruby-driver-v2.19/lib/mongo/auth/Amazon Web Services/request.rb', linha 188

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



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', linha 243

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 da sessão), se o token da sessão é fornecido e não expirou"
      aumentar Erro::CredentialCheckError, mensagem
    end
    Carga útil.buscar('GetCallerIdentityResponse').buscar('GetCallerIdentityResult')
  end
end