Classe: Mongo::Auth::Aws::Request Private
- Herda:
-
Objeto
- Objeto
- Mongo::Auth::Aws::Request
- 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.
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.
"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.
10
Recolhimento do Resumo do atributo de instância
-
#access_key_id ⇒ String
Somente leitura
privado
Access_key_id A ID da chave de acesso.
-
#host ➤ string
Somente leitura
privado
Host O valor do cabeçalho HTTP do Host a ser usado.
-
#secret_access_key ➤ string
Somente leitura
privado
Secret_access_key A chave de acesso secreta.
-
#server_nonce ➤ string
Somente leitura
privado
Server_nonce A string binária do servidor nonce.
-
#session_token ⇒ String
Somente leitura
privado
Session_token O token de sessão para credenciais temporárias.
-
#time ➤ Time
Somente leitura
privado
Hora A hora da solicitação.
Recolhimento do Resumo do método de instância
-
#autorização ➤ string
privado
Retorna o valor do cabeçalho de autorização, de acordo com a especificação V4 de assinatura do Amazon Web Services .
-
#canonical_request ➤ string
privado
Retorna a solicitação canônica usada durante o cálculo da assinatura do Amazon Web Services V4 .
-
#formatted_date ➤ string
privado
Formatted_date AAAAMMDD data formatada da solicitação.
-
#formatted_time ➤ string
privado
Formatted_time ISO8601-hora formatada da solicitação, como seria usada no cabeçalho X-Amz-Date.
-
#cabeçalhos ➤ <Hash>
privado
Retorna o hash contendo os cabeçalhos da solicitação canônica calculada.
-
#headers_to_sign ➤ <Hash>
privado
Retorna o hash contendo os cabeçalhos da solicitação canônica calculada que deve ser assinada, em um formato pronto para assinar.
-
#initialize(access_key_id:, secret_access_key:, session_token: nil, host:, server_nonce:, time: Time. now) ➤ Request
construtor
privado
Constrói a solicitação.
-
#região ➤ string
privado
Região A região do host, derivada do host.
-
#scope ➤ string
privado
Retorna o escopo da solicitação, de acordo com a especificação V4 de assinatura do Amazon Web Services .
-
#assinatura ➤ string
privado
Retorna a assinatura calculada da solicitação canônica, de acordo com a especificação V4 de assinatura do Amazon Web Services .
-
#subscribed_headers_string ➤ string
privado
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 .
-
#validate! ⇒ Hash
privado
Valida as credenciais e os componentes de solicitação construídos enviando uma solicitação real de STS GetCallerIdentity.
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.
Ao substituir o tempo, é possível criar solicitações reproduzíveis (em outras palavras, reproduzir uma solicitação).
Constrói a solicitação.
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.
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 |
#host ➤ 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 host O valor do cabeçalho HTTP Host a ser usado.
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.
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_nonce ➤ 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 server_nonce A string binária do servidor nonce.
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.
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 |
#time ➤ Time (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.
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ção ➤ 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 o valor do cabeçalho de autorização, de acordo com a especificação V4 de assinatura do Amazon Web Services .
235 236 237 |
# File 'build/ruby-driver-v2.19/lib/mongo/auth/Amazon Web Services/request.rb', linha 235 def "Amazon Web Services4-HMAC-SHA256 Credential=#{access_key_id}/#{scope}, SignedHeaders=#{subscribed_headers_string}, Signature=#{signature}" end |
#canonical_request ➤ 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 a solicitação canônica usada durante o cálculo da assinatura do 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', 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_date ➤ 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 formatted_date AAMMDD a data formatada da solicitação.
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_time ➤ 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 formatted_time ISO8601-hora formatada da solicitação, como seria usado no cabeçalho X-Amz-Date.
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.
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.
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.
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ão ➤ 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 a região A região do host, derivada do host.
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 |
#scope ➤ 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 o escopo da solicitação, de acordo com a especificação V4 de assinatura do Amazon Web Services .
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 |
#assinatura ➤ 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 a assinatura calculada da solicitação canônica, de acordo com a especificação V4 de assinatura do Amazon Web Services .
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 .
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.
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'] = 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') = 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}: #{ " 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 |