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.
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.
"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.
10
Resumen de atributos de la instancia colapsar
-
#access_key_id ⇒ String
Solo lectura
privado
Access_key_id El identificador de la 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 ⇒ Cadena
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
Hora La hora de la solicitud.
Resumen del método de instancia colapsar
-
#autorización ⇒ Cadena
privado
Devuelve el valor del encabezado de autorización, según la especificación V4 de la firma de AWS.
-
#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 AAAAMMDD fecha formateada 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.
-
#initialize(access_key_id:, secret_access_key:, session_token: nil, host:, server_nonce:, 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 V4 de la firma de AWS.
-
#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 ⇒ Cadena
privado
Devuelve una lista separada por punto y coma de nombres de encabezados firmados, según la especificación de firma V4 de AWS.
-
#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
#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.
Al sobrescribir el tiempo, es posible crear solicitudes reproducibles (es decir, reproducir una solicitud).
Construye la solicitud.
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_id ⇒ String (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.
77 78 79 |
# Archivo 'lib/mongo/auth/aws/request.rb', línea 77 def Access Key ID @access_key_id end |
#host ⇒ Cadena (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.
87 88 89 |
# Archivo 'lib/mongo/auth/aws/request.rb', línea 87 def host @host end |
#secret_access_key ⇒ string (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.
80 81 82 |
# Archivo 'lib/mongo/auth/aws/request.rb', línea 80 def clave de acceso secreta @secret_access_key end |
#server_nonce ⇒ String (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.
90 91 92 |
# Archivo 'lib/mongo/auth/aws/request.rb', línea 90 def server_nonce @server_nonce end |
#session_token ⇒ Cadena (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.
84 85 86 |
# Archivo 'lib/mongo/auth/aws/request.rb', línea 84 def session_token @session_token end |
#hora ⇒ Hora (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.
93 94 95 |
# Archivo 'lib/mongo/auth/aws/request.rb', línea 93 def hora @time end |
Detalles del método de instancia
#autorización ⇒ String
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.
235 236 237 |
# Archivo 'lib/mongo/auth/aws/request.rb', línea 235 def "AWS4-HMAC-SHA256 Credencial=#{access_key_id}/#{scope}, EncabezadosFirmados=#{signed_headers_string}, Firma=#{signature}" end |
#canonical_request ⇒ Cadena
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.
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_date ⇒ String
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.
102 103 104 |
# Archivo 'lib/mongo/auth/aws/request.rb', línea 102 def fecha formateada formatted_time[0, 8] end |
#formatted_time ⇒ String
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.
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.
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.
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.
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 |
#region ⇒ string
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.
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 |
#ámbito ⇒ string
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.
135 136 137 |
# Archivo 'lib/mongo/auth/aws/request.rb', línea 135 def Alcance "#{fecha_formateada}/#{región}/sts/aws4_request" end |
#firma ⇒ string
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.
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_string ⇒ String
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.
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.
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'] = 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') = 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.¿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 |