Clase: Mongo::Auth::Aws::Request Privada

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

Overview

Esta clase forma parte de una API privada. Debe evitar usarla siempre que sea posible, ya que podría eliminarse o modificarse en el futuro.

Clase auxiliar 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

Colapso delresumen constante

CUERPO_DE_SOLICITUD_STS =

Esta constante forma parte de una API privada. Debe evitar usarla siempre que sea posible, ya que podría eliminarse o modificarse en el futuro.

El cuerpo de la solicitud STS GetCallerIdentity.

Esta es actualmente la única solicitud que esta clase permite realizar.

Desde:

  • 2.0.0

"Acción=ObtenerIdentidadDeCaller&Versión=2011-06-15".freeze
VALIDATE_TIMEOUT =

Esta constante forma parte de una API privada. Debe evitar usarla siempre que sea posible, ya que podría eliminarse o modificarse en el futuro.

El tiempo de espera, en segundos, que se utilizará para validar las credenciales a través de STS.

Desde:

  • 2.0.0

10

Colapso delresumen de atributos de instancia

Colapso del resumen del método de instancia

Detalles del constructor

#inicializar(id_de_clave_de_acceso:, clave_de_acceso_secreta:, token_de_sesión: nulo, host:, nonce_del_servidor:, hora: Time.now) ⇒ Solicitud

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Nota:

Al anular el tiempo, es posible crear solicitudes reproducibles (en otras palabras, reproducir una solicitud).

Construye la solicitud.

Parámetros:

  • id de clave de acceso (Cadena) -

    El ID de la clave de acceso.

  • clave de acceso secreta (Cadena) -

    La clave de acceso secreta.

  • session_token (Cadena) (predeterminado: nulo)

    El token de sesión para credenciales temporales.

  • host (Cadena) -

    El valor del encabezado HTTP del host a utilizar.

  • servidor_nonce (Cadena) -

    La cadena binaria nonce del servidor.

  • hora (Tiempo) (predeterminado: Time.now)

    La hora de la solicitud.

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

def inicializar(id_de_clave_de_acceso:, clave de acceso secreta:, session_token: nulo,
  anfitrión:, servidor_nonce:, tiempo: Tiempo.ahora
)
  @access_key_id = id de clave de acceso
  @clave_de_acceso_secreta = clave de acceso secreta
  @session_token = session_token
  @host = host
  @server_nonce = servidor_nonce
  @tiempo = hora

  %i(id de clave de acceso clave de acceso secreta host servidor_nonce).cada hacer |arg|
    valor = obtención de variable de instancia("@#{arg}")
    Si valor.nil? || valor.¿vacío?
      propagar Error::Respuesta de autenticación de servidor no válida, "Elvalor para '#{arg} ' es obligatorio"
    end
  end

  Si host && host.longitud > 255
      propagar Error::InvalidServerAuthHost, "El valor para 'host' es demasiado largo: #{@host}"
  end
end

Detalles de los atributos de instancia

#access_key_idCadena (solo lectura)

Este método forma parte de una API privada. Debe evitarlo 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:

  • (Cadena) -

    access_key_id El identificador de la clave de acceso.

Desde:

  • 2.0.0



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

def id de clave de acceso
  @access_key_id
end

#hostCadena (solo lectura)

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve el host El valor del encabezado HTTP del host a utilizar.

Devuelve:

  • (Cadena) -

    host El valor del encabezado HTTP del Host a utilizar.

Desde:

  • 2.0.0



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

def host
  @host
end

#secret_access_keyCadena (solo lectura)

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve secret_access_key La clave de acceso secreta.

Devuelve:

  • (Cadena) -

    secret_access_key La clave de acceso secreta.

Desde:

  • 2.0.0



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

def clave de acceso secreta
  @clave_de_acceso_secreta
end

#server_nonceCadena (solo lectura)

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve server_nonce La cadena binaria nonce del servidor.

Devuelve:

  • (Cadena) -

    server_nonce La cadena binaria nonce del servidor.

Desde:

  • 2.0.0



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

def servidor_nonce
  @server_nonce
end

#session_tokenCadena (solo lectura)

Este método forma parte de una API privada. Debe evitarlo 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:

  • (Cadena) -

    session_token El token de sesión para credenciales temporales.

Desde:

  • 2.0.0



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

def session_token
  @session_token
end

#tiempoTiempo (solo lectura)

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve la hora La hora de la solicitud.

Devuelve:

  • (Time)

    hora La hora de la solicitud.

Desde:

  • 2.0.0



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

def hora
  @tiempo
end

Detalles del método de instancia

#autorizaciónCadena

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

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

Devuelve:

  • (Cadena) -

    Valor del encabezado de autorización.

Desde:

  • 2.0.0



235
236
237
# Archivo 'lib/mongo/auth/aws/request.rb', línea 235

def Autorización
  "CredencialAWS4-HMAC-SHA256 =#{id_de_clave_de_acceso}/#{alcance }, Encabezados_firmados =#{cadena_de_encabezados_firmados }, Firma =#{firma}"
end

#canonical_requestCadena

Este método forma parte de una API privada. Debe evitarlo 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:

  • (Cadena) -

    La solicitud canónica.

Desde:

  • 2.0.0



196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
# Archivo 'lib/mongo/auth/aws/request.rb', línea 196

def solicitud canónica
  cabeceras = encabezados_para_firmar
  encabezados serializados = cabeceras.map hacer |k, v|
    "#{k}: #{v}"
  end.Join("\n")
  carga útil hash = Resumen::SHA256.Nuevo.update(STS_REQUEST_BODY).hexdigest
  "POST\n/\n\n" +
    # Hay dos nuevas líneas después de los encabezados serializados porque
    # La especificación de firma V4 trata cada encabezado como si contuviera el
    # terminando nueva línea, y hay una nueva línea adicional
    # separando los encabezados de los nombres de encabezados firmados.
    "#{encabezados_serializados}\n\n" +
    "#{cadena_de_encabezados_firmados}\n" +
    carga útil hash
end

#fecha_formateadaCadena

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve formatted_date AAAAMMDD fecha formateada de la solicitud.

Devuelve:

  • (Cadena) -

    formatted_date AAAAMMDD fecha formateada de la solicitud.

Desde:

  • 2.0.0



102
103
104
# Archivo 'lib/mongo/auth/aws/request.rb', línea 102

def fecha formateada
  tiempo formateado[0, 8]
end

#formatted_timeCadena

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve la hora formateada ISO8601de la solicitud, tal como se usaría en el encabezado X-Amz-Date.

Devuelve:

  • (Cadena) -

    formatted_time Hora formateada ISO8601de la solicitud, tal como se usaría en el encabezado X-Amz-Date.

Desde:

  • 2.0.0



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

def tiempo formateado
  @hora_formateada ||= @tiempo.obtenerutc.tiempo de fuerza('%Y%m%dT%H%M%SZ')
end

#encabezados<Hash>

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Nota:

No todos estos encabezados son parte de la lista de encabezados firmados, las claves del hash no están necesariamente ordenadas lexicográficamente y las claves pueden estarlo 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



147
148
149
150
151
152
153
154
155
156
157
158
159
160
# Archivo 'lib/mongo/auth/aws/request.rb', línea 147

def cabeceras
  cabeceras = {
    'longitud del contenido' => STS_REQUEST_BODY.longitud.a_s,
    'content-type' => 'aplicación/x-www-form-urlencoded ',
    'host' => host,
    'x-amz-date' => tiempo formateado,
    'x-mongodb-gs2-cb-flag ' => 'n',
    'x-mongodb-server-nonce' => Base64.encode64(servidor_nonce).gsub("\n", ''),
  }
  Si session_token
    cabeceras['token de seguridad x-amz '] = session_token
  end
  cabeceras
end

#headers_to_sign<Hash>

Este método forma parte de una API privada. Debe evitarlo 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 firmar.

Las diferencias entre #headers y este método son las siguientes:

  • Elimina los encabezados que no se deben firmar. Según las especificaciones de AWS, debería ser posible firmar todos los encabezados, pero el servidor MongoDB espera que solo algunos encabezados estén firmados y no generará la solicitud correcta si otros encabezados están firmados.

  • Pone en minúsculas todos los nombres de encabezado.

  • Ordena los encabezados lexicográficamente en el hash.

Devuelve:

  • (<Hash>)

    headers Los encabezados.

Desde:

  • 2.0.0



175
176
177
178
179
180
181
182
# Archivo 'lib/mongo/auth/aws/request.rb', línea 175

def encabezados_para_firmar
  encabezados_para_firmar = {}
  cabeceras.claves.Ordenar por { |k| k.mayúsculas y minúsculas }.cada hacer |clave|
    tecla de escritura = clave.mayúsculas y minúsculas
    encabezados_para_firmar[tecla de escritura] = cabeceras[clave]
  end
  encabezados_para_firmar
end

#regiónCadena

Este método forma parte de una API privada. Debe evitarlo 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:

  • (Cadena) -

    región La región del huésped, derivada del huésped.

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

def región
  # Caso común
  Si host == 'sts.amazonaws.com'
    return 'nosotros-este-1 '
  end

  Si host.empezar_con?('.')
    propagar Error::InvalidServerAuthHost, "Elhost comienza con un punto: #{host}"
  end
  Si host.¿Fin_con?('.')
    propagar Error::InvalidServerAuthHost, "Elhost termina con un punto: #{host}"
  end

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

  Si partes.longitud == 1
    'nosotros-este-1 '
  else
    partes[1]
  end
end

#alcanceCadena

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

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

Devuelve:

  • (Cadena) -

    El alcance.

Desde:

  • 2.0.0



135
136
137
# Archivo 'lib/mongo/auth/aws/request.rb', línea 135

def ámbito de aplicación
  "#{fecha_formateada}/#{región}/sts/aws4_request"
end

#firmaCadena

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve la firma calculada de la solicitud canónica, según la especificación de firma V4 de AWS.

Devuelve:

  • (Cadena) -

    La firma.

Desde:

  • 2.0.0



216
217
218
219
220
221
222
223
224
225
226
227
228
229
# Archivo 'lib/mongo/auth/aws/request.rb', línea 216

def firma
  solicitud canónica hash = Resumen::SHA256.hexdigest(solicitud canónica)
  cadena_para_firmar = "AWS4-HMAC-SHA256\n" +
    "#{tiempo_formateado}\n" +
    "#{alcance}\n" +
    solicitud canónica hash
  # Todas las operaciones HMAC intermedias no están codificadas en hexadecimal.
  mac = hmac("AWS4#{clave_de_acceso_secreta}", fecha formateada)
  mac = hmac(mac, región)
  mac = hmac(mac, 'sts')
  clave de firma = hmac(mac, 'aws4_request')
  # Sólo la operación HMAC final está codificada en hexadecimal.
  hmac_hex(clave de firma, cadena_para_firmar)
end

#signed_headers_stringCadena

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve una lista separada por punto y coma de nombres de encabezados firmados, según la especificación de firma V4 de AWS.

Devuelve:

  • (Cadena) -

    La lista de encabezados firmados.

Desde:

  • 2.0.0



188
189
190
# Archivo 'lib/mongo/auth/aws/request.rb', línea 188

def cadena de encabezados firmados
  encabezados_para_firmar.claves.Join(';')
end

#validate!Hash

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Valida las credenciales y los componentes de solicitud construidos enviando una solicitud STS GetCallerIdentity real.

Devuelve:

  • (Hash)

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

def validate!
  sts_request = Net::HTTP::publicación.Nuevo("https://#{host}").grifo hacer |req|
    cabeceras.cada hacer |k, v|
      req[k] = v
    end
    req['autorización'] = Autorización
    req['aceptar '] = 'aplicación/json '
    req.cuerpo = STS_REQUEST_BODY
  end
  http = Net::HTTP.Nuevo(host, 443)
  http.usar_ssl = true
  http.Inicio hacer
    resp = Se acabó el tiempo.tiempo de espera(VALIDATE_TIMEOUT, Error::Error de comprobación de credenciales, 'Seagotó el tiempo de solicitud GetCallerIdentity') hacer
      http.Solicitud(sts_request)
    end
    carga útil = JSON.parse(resp.cuerpo)
    Si resp.Código != '200'
      código aws = carga útil.Fetch('Error').Fetch('Code')
      mensaje_aws = carga útil.Fetch('Error').Fetch('Mensaje')
      msg = "Laverificació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 no ser que msg.¿Fin_con?('.')
      msg += " Verifique que las credenciales sean válidas y, si son temporales (es decir, utilizan el token de sesión), que el token de sesión se proporcione y no esté vencido"
      propagar Error::Error de comprobación de credenciales, msg
    end
    carga útil.Fetch('Obtener respuesta de identidad de la persona que llama ').Fetch('ObtenerResultadoIdentidadDeCaller ')
  end
end