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

Colapso delresumen constante

STS_REQUEST_BODY =

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.

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

Desde:

  • 2.0.0

"Action=GetCallerIdentity&Version=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, 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

#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 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 (Cadena) (predeterminado: nulo)

    El token de sesión para credenciales temporales.

  • host (string)

    El valor de encabezado HTTP Host a usar.

  • server_nonce (string)

    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(access_key_id:, clave de acceso secreta:, session_token: nulo,
  host:, server_nonce:, 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 = obtención de variable de instancia("@#{arg}")
    si Valor.nil? || Valor.¿vacío?
      propagar Error::RespuestaDeAutenticaciónDeServidorInválida, "Valor 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_idString (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:

  • (string)

    access_key_id El id de clave de acceso.

Desde:

  • 2.0.0



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

def Access Key ID
  @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:

  • (string)

    host El valor de la cabecera Host HTTP a usar.

Desde:

  • 2.0.0



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

def host
  @host
end

#secret_access_keystring (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 secreta de acceso.

Devuelve:

  • (string)

    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
  @secret_access_key
end

#server_nonceString (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:

  • (string)

    server_nonce La string binaria nonce del servidor.

Desde:

  • 2.0.0



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

def server_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:

  • (string)

    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

#horaHora (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
  @time
end

Detalles del método de instancia

#autorizaciónString

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:

  • (string)

    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
  "AWS4-HMAC-SHA256 Credencial=#{access_key_id}/#{scope}, EncabezadosFirmados=#{signed_headers_string}, Firma=#{signature}"
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:

  • (string)

    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 canonical_request
  encabezados = cabeceras_para_firmar
  encabezados serializados = 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 forma parte de una API privada. Debe evitarlo 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 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
  formatted_time[0, 8]
end

#formatted_timeString

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



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

def formatted_time
  @hora_formateada ||= @time.obtenerutc.strftime('%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 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



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 encabezados
  encabezados = {
    'longitud del contenido' => 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).gsub("\n", ''),
  }
  si session_token
    encabezados['x-amz-security-token'] = session_token
  end
  encabezados
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 ser firmado.

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

  • 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



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

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 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:

  • (string)

    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 region
  # Caso común
  si host == 'sts.amazonaws.com'
    return 'us-east-1'
  end

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

  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 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:

  • (string)

    El alcance.

Desde:

  • 2.0.0



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

def Alcance
  "#{fecha_formateada}/#{región}/sts/aws4_request"
end

#firmastring

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, de acuerdo con la especificación de firma de AWS v4.

Devuelve:

  • (string)

    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
  hashed_canonical_request = Resumen::SHA256.hexdigest(canonical_request)
  cadena_para_firmar = "AWS4-HMAC-SHA256\n" +
    "#{tiempo_formateado}\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')
  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_stringString

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:

  • (string)

    La lista de encabezados firmados.

Desde:

  • 2.0.0



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

def signed_headers_string
  cabeceras_para_firmar.claves.unirse(';')
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 la solicitud construida mediante el envío de una solicitud STS GetCallerIdentity real.

Devuelve:

  • (encriptada)

    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}").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 = Se acabó el tiempo.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.¿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::CredentialCheckError, msg
    end
    payload.obtener('GetCallerIdentityResponse').obtener('GetCallerIdentityResult')
  end
end