Skip to content

Autenticacion

Andres Ramos edited this page Sep 2, 2022 · 2 revisions

Descripcion

Para poder utilizar el servicio web de descarga masiva de CFDIs y enviar solicitudes es necesario primero autenticarse con el servicio web. La autenticacion se realiza enviando una solicitud de autenticacion al servicio web y obteniendo un Token que sera necesario para poder envar las solicitudes de tipo Solicitud, Verificacion, y Descarga.

Crear Solicitud

Para crear una solicitud de autenticacion utilizamos el metodo estatico CreateInstance de la clase AutenticacionRequest.

public static AutenticacionRequest CreateInstance()

Este metodo crea una solicitud de autenticacion valida por los siguientes 5 minutos a partir de cuando se crea.

La clase AutenticacionRequest esta formada de las siguientes propiedades:

  • TokenCreatedDateUtc - Fecha de cuando el token fue creado en formato UTC.
  • TokenExpiresDateUtc - Fecha de cuando el token expira en formato UTC.
  • Uuid - UUID unico para asociar a la solicitud.

Muy importante tener en cuenta que deben de haber 5 minutos de diferencia entre la fecha TokenCreatedDateUtc y la fecha TokenExpiresDateUtc.

Enviar solicitud

Para enviar la solicitud de autenticacion al servicio web utilizamos el metodo SendSoapRequestAsync del servicio AutenticacionService.

public async Task<AutenticacionResult> SendSoapRequestAsync(AutenticacionRequest autenticacionRequest,
                                                            X509Certificate2 certificate,
                                                            CancellationToken cancellationToken = default)

Parametros del metodo SendSoapRequestAsync:

  • AutenticacionRequest - Solicitud de autenticacion.
  • X509Certificate2 - Certificado SAT (.pfx).
  • CancellationToken - Token de cancelacion.

El metodo SendSoapRequestAsync:

  1. Genera el contenido SOAP de la solicitud HTTP tomando la informacion de AutenticacionRequest.
  2. Crea la solicitud HTTP
  3. Envia la solicitud HTTP al servicio web.
  4. Regresar el resultado de la solicitud HTTP ya deserializado en la clase AutenticacionResult.

Validar Resultado

La solicitud regresa el resultado AutenticacionResult con las siguientes propiedades:

  • AccessToken - Token de autorizacion para autenticar solicitudes con el web service.
  • FaultCode - Codigo de error en caso de fallar la autenticacion.
  • FaultString - Mensaje de error en caso de fallar la autenticacion.
  • HttpStatusCode - Codigo de estatus de la respuesta HTTP.
  • ResponseContent - Contenido del mensage de la respuesta HTTP.

Si la autenticacion fue exitosa la propiedad AccessToken.IsValid == true y tenemos un token valido por los siguientes 5 minutos. Si la autenticacion no fue exitosa no se obtendra un Token y no se podra hacer uso del servicio web. Sera necesario validar el valor de las propiedades FaultCode y FaultString para saber que tipo de error marco el servicio web y poder hacer los ajustes necesarios para volver a intentar autenticarse.

Ejemplo

logger.LogInformation("Buscando el servicio de autenticacion en el contenedor de servicios (Dependency Injection).");
var autenticacionService = host.Services.GetRequiredService<IAutenticacionService>();

logger.LogInformation("Creando solicitud de autenticacion.");
var autenticacionRequest = AutenticacionRequest.CreateInstance();

logger.LogInformation("Enviando solicitud de autenticacion.");
AutenticacionResult autenticacionResult =
    await autenticacionService.SendSoapRequestAsync(autenticacionRequest, certificadoSat, cancellationToken);

if (!autenticacionResult.AccessToken.IsValid)
{
    logger.LogError("La solicitud de autenticacion no fue exitosa. FaultCode:{0} FaultString:{1}",
        autenticacionResult.FaultCode,
        autenticacionResult.FaultString);
    throw new Exception();
}

logger.LogInformation("La solicitud de autenticacion fue exitosa. AccessToken:{0}", autenticacionResult.AccessToken.DecodedValue);