authenticateWithProcurador method
- required String consumerKey,
- required String consumerSecret,
- required String contratanteNumero,
- required String autorPedidoDadosNumero,
- String? certificadoDigitalBase64,
- String? certificadoDigitalPath,
- String? senhaCertificado,
- String ambiente = 'trial',
- String? contratanteNome,
- String? autorNome,
- String? contribuinteNumero,
- String? autorNumero,
- String? certificadoProcuradorPath,
- String? certificadoProcuradorBase64,
- String? certificadoProcuradorPassword,
Autenticação Unificada: OAuth2 + Procurador em um único passo
Este método combina a autenticação OAuth2 básica com a autenticação do procurador em uma única chamada, facilitando o uso quando ambas são necessárias.
consumerKey: Chave do consumidor fornecida pelo SERPRO
consumerSecret: Segredo do consumidor forneida pelo SERPRO
contratanteNumero: CNPJ da empresa contratante
autorPedidoDadosNumero: CPF/CNPJ do autor do pedido
certificadoDigitalBase64: Certificado digital em Base64 (opcional)
certificadoDigitalPath: Caminho para o arquivo do certificado digital (opcional)
senhaCertificado: Senha do certificado digital (opcional)
ambiente: Ambiente de execução ('trial' ou 'producao')
Parâmetros do Procurador (se fornecidos, faz autenticação completa):
contratanteNome: Nome da empresa contratante
autorNome: Nome do autor da procuração
contribuinteNumero: CNPJ do contribuinte (se diferente do contratante)
autorNumero: CPF/CNPJ do autor (se diferente do autorPedidoDadosNumero)
certificadoProcuradorPath: Caminho do certificado do procurador
certificadoProcuradorBase64: Certificado do procurador em Base64
certificadoProcuradorPassword: Senha do certificado do procurador
Implementation
Future<void> authenticateWithProcurador({
required String consumerKey,
required String consumerSecret,
required String contratanteNumero,
required String autorPedidoDadosNumero,
String? certificadoDigitalBase64,
String? certificadoDigitalPath,
String? senhaCertificado,
String ambiente = 'trial',
// Parâmetros do Procurador (se fornecidos, faz autenticação completa)
String? contratanteNome,
String? autorNome,
String? contribuinteNumero,
String? autorNumero,
String? certificadoProcuradorPath,
String? certificadoProcuradorBase64,
String? certificadoProcuradorPassword,
}) async {
// Limpar dados da autenticação anterior para evitar conflitos
clearAuthentication();
// Usar autenticação procurador via Cloud Function se URL estiver configurada
if (_urlAutenticacaoProcurado != null &&
_urlAutenticacaoProcurado!.isNotEmpty &&
contratanteNome != null &&
autorNome != null) {
// Armazenar certificado para uso no proxy
_cloudFunctionCertBase64 =
certificadoProcuradorBase64 ?? certificadoDigitalBase64;
_cloudFunctionCertPassword =
certificadoProcuradorPassword ?? senhaCertificado;
await _authenticateWithProcuradorViaCloudFunction(
consumerKey: consumerKey,
consumerSecret: consumerSecret,
contratanteNumero: contratanteNumero,
contratanteNome: contratanteNome,
autorPedidoDadosNumero: autorNumero ?? autorPedidoDadosNumero,
autorNome: autorNome,
ambiente: ambiente,
contribuinteNumero: contribuinteNumero ?? contratanteNumero,
certificadoDigitalBase64: certificadoDigitalBase64,
senhaCertificado: senhaCertificado,
certificadoProcuradorBase64: certificadoProcuradorBase64,
certificadoProcuradorPassword: certificadoProcuradorPassword,
);
_contribuinteNumero = contribuinteNumero ?? contratanteNumero;
return;
}
// Validações dos parâmetros do procurador (se fornecidos)
if (contratanteNome != null || autorNome != null) {
// Se forneceu um parâmetro do procurador, todos os obrigatórios devem estar presentes
if (contratanteNome == null || contratanteNome.trim().isEmpty) {
throw Exception('Parâmetro obrigatório ausente: contratanteNome');
}
if (autorNome == null || autorNome.trim().isEmpty) {
throw Exception('Parâmetro obrigatório ausente: autorNome');
}
// Validar se há pelo menos um certificado disponível
final hasCertificadoDigital =
certificadoDigitalPath != null || certificadoDigitalBase64 != null;
final hasCertificadoProcurador =
certificadoProcuradorPath != null ||
certificadoProcuradorBase64 != null;
if (!hasCertificadoDigital && !hasCertificadoProcurador) {
throw Exception(
'Certificado digital necessário. Forneça certificadoDigitalPath/Base64 ou certificadoProcuradorPath/Base64',
);
}
}
// 1. Fazer autenticação OAuth2 normal
await authenticate(
consumerKey: consumerKey,
consumerSecret: consumerSecret,
contratanteNumero: contratanteNumero,
autorPedidoDadosNumero: autorPedidoDadosNumero,
certificadoDigitalBase64: certificadoDigitalBase64,
certificadoDigitalPath: certificadoDigitalPath,
senhaCertificado: senhaCertificado,
ambiente: ambiente,
);
// Armazenar contribuinteNumero para uso como padrão nos serviços
_contribuinteNumero = contribuinteNumero ?? contratanteNumero;
// 2. Se parâmetros do procurador foram fornecidos, fazer autenticação do procurador
if (contratanteNome != null && autorNome != null) {
// Validar se a autenticação OAuth2 foi bem-sucedida
if (_authModel == null) {
throw Exception(
'Falha na autenticação OAuth2. Não é possível prosseguir com a autenticação do procurador.',
);
}
final service = AutenticaProcuradorService(this);
final response = await service.autenticarProcurador(
contratanteNumero: contratanteNumero,
contratanteNome: contratanteNome,
autorNome: autorNome,
contribuinteNumero: contribuinteNumero ?? contratanteNumero,
autorNumero: autorNumero ?? autorPedidoDadosNumero,
certificadoPath: certificadoProcuradorPath ?? certificadoDigitalPath,
certificadoBase64: certificadoProcuradorBase64,
certificadoPassword: certificadoProcuradorPassword ?? senhaCertificado,
);
if (!response.sucesso) {
throw Exception(
'Falha na autenticação do procurador.: ${response.mensagemPrincipal}',
);
}
// Atualizar o _authModel com o token do procurador
_updateProcuradorToken(response.autenticarProcuradorToken ?? '');
}
}