Clase: Mongo::Auth::Aws::Request Privado

Hereda:
Objeto
  • Objeto
Mostrar todo
Definido en:
lib/mongo/auth/aws/request.rb

Overview

Esta clase forma parte de una API privada. Evita usar esta clase si es posible, ya que puede ser eliminada o modificada en el futuro.

Clase asistente para trabajar con solicitudes de AWS.

El propósito primario de esta clase es producir la solicitud canónica de AWS STS y calcular los encabezados firmados y la firma para ella.

Desde:

  • 2.0.0

Resumen de constantes colapsar

STS_REQUEST_BODY =

Esta constante es parte de una API privada. Deberías evitar usar esta constante si es posible, ya que podría ser retirada o cambiada en el futuro.

El cuerpo de la solicitud STS GetCallerIdentity.

Actualmente, esta es la única solicitud que esta clase admite.

Desde:

  • 2.0.0

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

Esta constante es parte de una API privada. Deberías evitar usar esta constante si es posible, ya que podría ser retirada o cambiada en el futuro.

El tiempo de espera, en segundos, para utilizar en la validación de credenciales a través de STS.

Desde:

  • 2.0.0

10

Resumen de atributos de la instancia colapsar

Resumen del método de instancia colapsar

Detalles del Constructor

#initialize(access_key_id:, secret_access_key:, host:, server_nonce:, session_token: nil, time: Time.now) ⇒ Request

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Nota:

Al sobrescribir el tiempo, es posible crear solicitudes reproducibles (es decir, reproducir una solicitud).

Construye la solicitud.

Parámetros:

  • Access Key ID (string)

    El ID de la clave de acceso.

  • clave_de_acceso_secreta (string)

    La clave secreta de acceso.

  • session_token (string) (valor por defecto: nil)

    El token de sesión para credenciales temporales.

  • host (string)

    El valor de encabezado HTTP Host a usar.

  • server_nonce (string)

    La string binaria de nonce del servidor.

  • hora (Tiempo) (por defecto: Time.now)

    La hora de la solicitud.

Aumenta:

Desde:

  • 2.0.0



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# Archivo 'lib/mongo/auth/aws/request.rb', línea 51

def inicializar(access_key_id:, secret_access_key:, host:, server_nonce:, session_token: nulo, hora: Tiempo.ahora)
  @access_key_id = Access Key ID
  @secret_access_key = clave_de_acceso_secreta
  @session_token = session_token
  @host = host
  @server_nonce = server_nonce
  @time = hora

  %i[Access Key ID clave_de_acceso_secreta host server_nonce].cada hacer |arg|
    Valor = instance_variable_get("@#{arg}")
    propagar Error::RespuestaDeAutenticaciónDeServidorInválida, "Valor para '#{arg}' es obligatorio" si Valor.nil? || Valor.¿vacío?
  end

  return a menos que host && host.longitud > 255

  propagar Error::InvalidServerAuthHost, "El valor para 'host' es demasiado largo: #{@host}"
end

Detalles de atributo de instancias

#access_key_idString (solo lectura)

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve access_key_id El ID de la clave de acceso.

Devuelve:

  • (string)

    access_key_id El id de clave de acceso.

Desde:

  • 2.0.0



70
71
72
# Archivo 'lib/mongo/auth/aws/request.rb', línea 70

def Access Key ID
  @access_key_id
end

#hostString (solo lectura)

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Retorna host El valor del encabezado HTTP Host a utilizar.

Devuelve:

  • (string)

    host El valor de la cabecera Host HTTP a usar.

Desde:

  • 2.0.0



80
81
82
# Archivo 'lib/mongo/auth/aws/request.rb', línea 80

def host
  @host
end

#secret_access_keystring (solo lectura)

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve secret_access_key. La clave secreta de acceso.

Devuelve:

  • (string)

    secret_access_key La clave de acceso secreta.

Desde:

  • 2.0.0



73
74
75
# Archivo 'lib/mongo/auth/aws/request.rb', línea 73

def clave_de_acceso_secreta
  @secret_access_key
end

#server_nonceString (solo lectura)

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve server_nonce La string binaria del servidor.

Devuelve:

  • (string)

    server_nonce La string binaria nonce del servidor.

Desde:

  • 2.0.0



83
84
85
# Archivo 'lib/mongo/auth/aws/request.rb', línea 83

def server_nonce
  @server_nonce
end

#session_tokenString (solo lectura)

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve session_token El token de sesión para credenciales temporales.

Devuelve:

  • (string)

    session_token El token de sesión para credenciales temporales.

Desde:

  • 2.0.0



77
78
79
# Archivo 'lib/mongo/auth/aws/request.rb', línea 77

def session_token
  @session_token
end

#horaHora (solo lectura)

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve tiempo La hora de la solicitud.

Devuelve:

  • (Time)

    hora La hora de la solicitud.

Desde:

  • 2.0.0



86
87
88
# Archivo 'lib/mongo/auth/aws/request.rb', línea 86

def hora
  @time
end

Detalles del método de instancia

#autorizaciónString

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve el valor del encabezado autorización, según la especificación de la firma AWS V4.

Devuelve:

  • (string)

    Valor del encabezado de autorización.

Desde:

  • 2.0.0



220
221
222
# Archivo 'lib/mongo/auth/aws/request.rb', línea 220

def Autorización
  "AWS4-HMAC-SHA256 Credencial=#{access_key_id}/#{scope}, EncabezadosFirmados=#{signed_headers_string}, Firma=#{signature}"
end

#canonical_requestString

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve la solicitud canónica utilizada durante el cálculo de la firma AWS V4.

Devuelve:

  • (string)

    La solicitud canónica.

Desde:

  • 2.0.0



181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
# Archivo 'lib/mongo/auth/aws/request.rb', línea 181

def canonical_request
  encabezados = cabeceras_para_firmar
  serialized_headers = encabezados.map hacer |k, v|
    "#{k}:#{v}"
  end.unirse("\n")
  hashed_payload = Resumen::SHA256.Nuevo.update(STS_REQUEST_BODY).hexdigest
  "POST\n/\n\n" +
    # Hay dos saltos de línea después de los encabezados serializados porque el
    # la especificación de la firma V4 trata cada cabecera como si contuviera el
    # nueva línea final y hay una nueva línea adicional
    # separando los encabezados de los nombres de encabezados firmados.
    "#{serialized_headers}\n\n" +
    "#{signed_headers_string}\n" +
    hashed_payload
end

#formatted_dateString

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve la fecha con formato YYYYMMDD de la solicitud.

Devuelve:

  • (string)

    formatted_date YYYYMMDD fecha formateada de la solicitud.

Desde:

  • 2.0.0



95
96
97
# Archivo 'lib/mongo/auth/aws/request.rb', línea 95

def fecha_formateada
  formatted_time[0, 8]
end

#formatted_timeString

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve la hora formatted_time en formato ISO8601de la solicitud, tal y como se usaría en la cabecera X-Amz-Date.

Devuelve:

  • (string)

    formatted_time ISO8601-hora formateada de la solicitud, tal como se utilizaría en el encabezado X-Amz-Date.

Desde:

  • 2.0.0



90
91
92
# Archivo 'lib/mongo/auth/aws/request.rb', línea 90

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

#encabezados<Hash>

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Nota:

No todos estos encabezados forman parte de la lista de encabezados firmados, las claves del hash no necesariamente están ordenadas lexicográficamente, y las claves pueden estar en cualquier caso.

Devuelve el hash que contiene los encabezados de la solicitud canónica calculada.

Devuelve:

  • (<Hash>)

    headers Los encabezados.

Desde:

  • 2.0.0



134
135
136
137
138
139
140
141
142
143
144
145
# Archivo 'lib/mongo/auth/aws/request.rb', línea 134

def encabezados
  encabezados = {
    'content-length' => STS_REQUEST_BODY.longitud.to_s,
    'content-type' => 'application/x-www-form-urlencoded',
    'host' => host,
    'x-amz-date' => formatted_time,
    'x-mongodb-gs2-cb-flag' => 'n',
    'x-mongodb-server-nonce' => Base64.encode64(server_nonce).borrar("\n"),
  }
  encabezados['x-amz-security-token'] = session_token si session_token
  encabezados
end

#headers_to_sign<Hash>

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve el hash que contiene los encabezados de la solicitud canónica calculada que debe firmarse, en un formato listo para ser firmado.

Las diferencias entre #headers y este método es este método:

  • Remueve todos los encabezados que no deben firmarse. Según las especificaciones de AWS, debería ser posible firmar todos los headers, pero el servidor MongoDB espera que solo algunos headers sean firmados y no formará la solicitud correcta si se firman otros headers.
  • Se convierten todos los nombres de encabezado a minúsculas.
  • Ordena los encabezados lexicográficamente en el hash.

Devuelve:

  • (<Hash>)

    headers Los encabezados.

Desde:

  • 2.0.0



160
161
162
163
164
165
166
167
# Archivo 'lib/mongo/auth/aws/request.rb', línea 160

def cabeceras_para_firmar
  cabeceras_para_firmar = {}
  encabezados.claves.ordenar_por { |k| k.minúscula }.cada hacer |llave|
    write_key = llave.minúscula
    cabeceras_para_firmar[write_key] = encabezados[llave]
  end
  cabeceras_para_firmar
end

#regionstring

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve región La región del host, derivada del host.

Devuelve:

  • (string)

    región La región del host, derivada del host.

Aumenta:

Desde:

  • 2.0.0



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# Archivo 'lib/mongo/auth/aws/request.rb', línea 100

def region
  # Caso común
  return 'us-east-1' si host == 'sts.amazonaws.com'

  propagar Error::InvalidServerAuthHost, "El host comienza con un punto: #{host}" si host.start_with?('.')
  propagar Error::InvalidServerAuthHost, "El host termina con un punto: #{host}" si host.end_with?('.')

  piezas = host.división('.')
  si piezas.any? { |parte| parte.¿vacío? }
    propagar Error::InvalidServerAuthHost, "El host tiene un componente vacío: #{host}"
  end

  si piezas.longitud == 1
    'us-east-1'
  else
    piezas[1]
  end
end

#ámbitostring

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve el alcance de la solicitud, según la especificación de la firma de AWS V4.

Devuelve:

  • (string)

    El alcance.

Desde:

  • 2.0.0



122
123
124
# Archivo 'lib/mongo/auth/aws/request.rb', línea 122

def Alcance
  "#{formatted_date}/#{región}/sts/aws4_solicitud"
end

#firmastring

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve la firma calculada de la solicitud canónica, de acuerdo con la especificación de firma de AWS v4.

Devuelve:

  • (string)

    La firma.

Desde:

  • 2.0.0



201
202
203
204
205
206
207
208
209
210
211
212
213
214
# Archivo 'lib/mongo/auth/aws/request.rb', línea 201

def firma
  hashed_canonical_request = Resumen::SHA256.hexdigest(canonical_request)
  string_to_sign = "AWS4-HMAC-SHA256\n" +
                   "#{formatted_time}\n" +
                   "#{scope}\n" +
                   hashed_canonical_request
  # Todas las operaciones intermedias HMAC no están codificadas en hexadecimal.
  mac = hmac("AWS4#{secret_access_key}", fecha_formateada)
  mac = hmac(mac, region)
  mac = hmac(mac, 'sts')
  signing_key = hmac(mac, 'aws4_request')
  # Solo la operación final de HMAC está codificada en hexadecimal.
  hmac_hex(signing_key, string_to_sign)
end

#signed_headers_stringString

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve una lista de nombres de cabeceras firmadas, separadas por punto y coma, según la especificación de la firma AWS V4.

Devuelve:

  • (string)

    La lista de encabezados firmados.

Desde:

  • 2.0.0



173
174
175
# Archivo 'lib/mongo/auth/aws/request.rb', línea 173

def signed_headers_string
  cabeceras_para_firmar.claves.unirse(';')
end

#validate!Hash

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Valida las credenciales y los componentes de la solicitud construida mediante el envío de una solicitud STS GetCallerIdentity real.

Devuelve:

  • (encriptada)

    Resultado de 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
# Archivo 'lib/mongo/auth/aws/request.rb', línea 228

def validate!
  sts_request = Net::HTTP::publicación.Nuevo("https://#{host}").tocar hacer |req|
    encabezados.cada hacer |k, v|
      req[k] = v
    end
    req['autorización'] = Autorización
    req['se acepta'] = 'application/json'
    req.cuerpo = STS_REQUEST_BODY
  end
  http = Net::HTTP.Nuevo(host, 443)
  http.use_ssl = true
  http.Inicio hacer
    resp = Tiempo de espera.tiempo de espera(VALIDATE_TIMEOUT, Error::CredentialCheckError,
                           'La solicitud GetCallerIdentity ha superado el tiempo de espera') hacer
      http.Solicitud(sts_request)
    end
    payload = JSON.parse(resp.cuerpo)
    si resp.Código != '200'
      aws_code = payload.obtener('Error').obtener('Code')
      aws_message = payload.obtener('Error').obtener('Mensaje')
      msg = "Revisión de credenciales para el usuario #{access_key_id} falló con el código de estado HTTP #{resp.code}: #{aws_code}: #{aws_message}"
      msg += '.' a menos que msg.end_with?('.')
      msg += ' Por favor, comprueba que las credenciales sean válidas y, en caso de que sean temporales (es decir, se utilice el token de sesión), que el token de sesión esté proporcionado y no haya caducado'
      propagar Error::CredentialCheckError, msg
    end
    payload.obtener('GetCallerIdentityResponse').obtener('GetCallerIdentityResult')
  end
end