Clase: Mongo::Auth::Aws::Request Privada
- Hereda:
-
Objeto
- Objeto
- Mongo::Auth::Aws::Solicitud
- 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.
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.
"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.
10
Colapso delresumen de atributos de instancia
-
#access_key_id ⇒ String
solo lectura
privada
Access_key_id El identificador de la clave de acceso.
-
#host ⇒ String
solo lectura
privada
Host El valor del encabezado HTTP del Host a utilizar.
-
#clave_de_acceso_secreta ⇒ Cadena
solo lectura
privada
Secret_access_key La clave de acceso secreta.
-
#server_nonce ⇒ Cadena
solo lectura
privada
Server_nonce La cadena binaria nonce del servidor.
-
#session_token ⇒ String
solo lectura
privada
Session_token El token de sesión para credenciales temporales.
-
#tiempo ⇒ Tiempo
solo lectura
privada
Hora La hora de la solicitud.
Colapso del resumen del método de instancia
-
#autorización ⇒ Cadena
privada
Devuelve el valor del encabezado de autorización, según la especificación V4 de la firma de AWS.
-
#canonical_request ⇒ Cadena
privada
Devuelve la solicitud canónica utilizada durante el cálculo de la firma AWS V4.
-
#fecha_formateada ⇒ Cadena
privada
Formatted_date AAAAMMDD fecha formateada de la solicitud.
-
#formatted_time ⇒ Cadena
privada
Formatted_time Hora con formato ISO8601de la solicitud, tal como se usaría en el encabezado X-Amz-Date.
-
#encabezados ⇒ <Hash>
privada
Devuelve el hash que contiene los encabezados de la solicitud canónica calculada.
-
#headers_to_sign ⇒ <Hash>
privada
Devuelve el hash que contiene los encabezados de la solicitud canónica calculada que debe firmarse, en un formato listo para firmar.
-
#inicializar(id_de_clave_de_acceso:, clave_de_acceso_secreta:, token_de_sesión: nulo, host:, nonce_del_servidor:, hora: Time.now) ⇒ Solicitud
constructor
privada
Construye la solicitud.
-
#región ⇒ Cadena
privada
Región La región del host, derivada del host.
-
#alcance ⇒ Cadena
privada
Devuelve el alcance de la solicitud, según la especificación V4 de la firma de AWS.
-
#firma ⇒ Cadena
privada
Devuelve la firma calculada de la solicitud canónica, según la especificación de firma V4 de AWS.
-
#signed_headers_string ⇒ Cadena
privada
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
privada
Valida las credenciales y los componentes de solicitud construidos enviando 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 anular el tiempo, es posible crear solicitudes reproducibles (en otras palabras, 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(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_id ⇒ 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 access_key_id El ID de la clave de acceso.
77 78 79 |
# Archivo 'lib/mongo/auth/aws/request.rb', línea 77 def id de clave de acceso @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 ⇒ 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 secret_access_key La clave de acceso secreta.
80 81 82 |
# Archivo 'lib/mongo/auth/aws/request.rb', línea 80 def clave de acceso secreta @clave_de_acceso_secreta end |
#server_nonce ⇒ 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 server_nonce La cadena binaria nonce del servidor.
90 91 92 |
# Archivo 'lib/mongo/auth/aws/request.rb', línea 90 def servidor_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 |
#tiempo ⇒ Tiempo (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 @tiempo end |
Detalles del método de instancia
#autorización ⇒ 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 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 "CredencialAWS4-HMAC-SHA256 =#{id_de_clave_de_acceso}/#{alcance }, Encabezados_firmados =#{cadena_de_encabezados_firmados }, Firma =#{firma}" 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 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_formateada ⇒ 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 formatted_date AAAAMMDD fecha formateada de la solicitud.
102 103 104 |
# Archivo 'lib/mongo/auth/aws/request.rb', línea 102 def fecha formateada tiempo formateado[0, 8] end |
#formatted_time ⇒ 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 hora formateada ISO8601de la solicitud, tal como se usaría en el encabezado X-Amz-Date.
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.
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.
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.
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ón ⇒ 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 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 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 |
#alcance ⇒ 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 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 ámbito de aplicación "#{fecha_formateada}/#{región}/sts/aws4_request" end |
#firma ⇒ 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 firma calculada de la solicitud canónica, según la especificación de firma V4 de AWS.
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_string ⇒ 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 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 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.
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'] = 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') = 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 }: #{}" 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 |