Clase: Mongo::Auth::Aws::Request Privado
- Hereda:
-
Objeto
- Objeto
- Mongo::Auth::Aws::Solicitud
- 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.
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.
'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.
10
Resumen de atributos de la instancia colapsar
-
#access_key_id ⇒ String
Solo lectura
privado
Access_key_id El ID de clave de acceso.
-
#host ⇒ String
Solo lectura
privado
Host El valor de la cabecera HTTP del Host a utilizar.
-
#secret_access_key ⇒ String
Solo lectura
privado
Secret_access_key La clave de acceso secreta.
-
#server_nonce ⇒ String
Solo lectura
privado
Server_nonce La string binaria nonce del servidor.
-
#session_token ⇒ String
Solo lectura
privado
Session_token El token de sesión para credenciales temporales.
-
#time ⇒ Tiempo
Solo lectura
privado
Tiempo La hora de la solicitud.
Resumen del método de instancia colapsar
-
#autorización ⇒ Cadena
privado
Devuelve el valor del encabezado autorización, según la especificación de la firma AWS V4.
-
#canonical_request (solicitud canónica) ⇒ String (Cadena)
privado
Devuelve la solicitud canónica utilizada durante el cálculo de la firma AWS V4.
-
#formatted_date ⇒ String
privado
Formatted_date Fecha formateada del YYYYMMDD de la solicitud.
-
#formatted_time ⇒ String
privado
Formatted_time Hora de la solicitud en formato ISO8601, como se usaría en el encabezado X-Amz-Date.
-
#cabeceras ⇒ <Hash>
privado
Devuelve el hash que contiene los encabezados de la solicitud canónica calculada.
-
#headers_to_sign ⇒ <Hash>
privado
Devuelve el hash que contiene los encabezados de la solicitud canónica calculada que debe firmarse, en un formato listo para ser firmado.
-
#inicializar(access_key_id:, secret_access_key:, host:, server_nonce:, session_token: nil, time: Time.now) ⇒ solicitud
constructor
privado
Construye la solicitud.
-
#región ⇒ String
privado
Región La región del host, derivada del host.
-
#scope ⇒ string
privado
Devuelve el alcance de la solicitud, según la especificación de la firma de AWS V4.
-
#signature ⇒ String
privado
Devuelve la firma calculada de la solicitud canónica, de acuerdo con la especificación de firma de AWS v4.
-
#signed_headers_string ⇒ String
privado
Devuelve una lista de nombres de cabeceras firmadas, separadas por punto y coma, según la especificación de la firma AWS V4.
-
#validate! ⇒ Hash
privado
Valida las credenciales y los componentes de la solicitud construida mediante el envío de una solicitud STS GetCallerIdentity real.
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.
Al sobrescribir el tiempo, es posible crear solicitudes reproducibles (es decir, reproducir una solicitud).
Construye la solicitud.
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_id ⇒ String (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.
70 71 72 |
# Archivo 'lib/mongo/auth/aws/request.rb', línea 70 def Access Key ID @access_key_id end |
#host ⇒ String (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.
80 81 82 |
# Archivo 'lib/mongo/auth/aws/request.rb', línea 80 def host @host end |
#secret_access_key ⇒ string (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.
73 74 75 |
# Archivo 'lib/mongo/auth/aws/request.rb', línea 73 def clave_de_acceso_secreta @secret_access_key end |
#server_nonce ⇒ String (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.
83 84 85 |
# Archivo 'lib/mongo/auth/aws/request.rb', línea 83 def server_nonce @server_nonce end |
#session_token ⇒ String (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.
77 78 79 |
# Archivo 'lib/mongo/auth/aws/request.rb', línea 77 def session_token @session_token end |
#hora ⇒ Hora (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.
86 87 88 |
# Archivo 'lib/mongo/auth/aws/request.rb', línea 86 def hora @time end |
Detalles del método de instancia
#autorización ⇒ String
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.
220 221 222 |
# Archivo 'lib/mongo/auth/aws/request.rb', línea 220 def "AWS4-HMAC-SHA256 Credencial=#{access_key_id}/#{scope}, EncabezadosFirmados=#{signed_headers_string}, Firma=#{signature}" end |
#canonical_request ⇒ String
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.
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_date ⇒ String
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.
95 96 97 |
# Archivo 'lib/mongo/auth/aws/request.rb', línea 95 def fecha_formateada formatted_time[0, 8] end |
#formatted_time ⇒ String
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.
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.
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.
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.
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 |
#region ⇒ string
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.
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 |
#ámbito ⇒ string
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.
122 123 124 |
# Archivo 'lib/mongo/auth/aws/request.rb', línea 122 def Alcance "#{formatted_date}/#{región}/sts/aws4_solicitud" end |
#firma ⇒ string
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.
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_string ⇒ String
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.
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.
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'] = 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') = 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}: #{}" 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 |