A validação biométrica está se tornando uma ferramenta indispensável em um mundo cada vez mais digital, desempenhando um papel crucial em áreas como segurança e autenticação de usuários. Com o crescimento das preocupações relacionadas à segurança e à privacidade, soluções que utilizam características únicas do ser humano, como impressões digitais, reconhecimento facial e íris, têm se destacado pela eficácia e precisão.
O que é a API Kairos?
A Kairos é uma API de reconhecimento facial que utiliza inteligência artificial para identificar e verificar pessoas com base em características faciais. A API oferece a funcionalidade de verificação biométrica, que compara duas imagens para confirmar a identidade do usuário.
Implementação da validação biométrica
Para ilustrar o nosso exemplo, vamos considerar um cenário em que queremos validar a identidade de um funcionário usando uma selfie e uma imagem que foi armazenada no momento do seu cadastro. O primeiro passo que devemos tomar é definir as variáveis que serão utilizadas ao longo do código:
string apiUrl = "https://idv-eu.kairos.com/v0.1/biometric-verification";
string appId = "IdentificadorAPP";
string appKey = "ChaveDaSuaAPI";
string selfieFilePath = @"C:\Caminho\da\Imagem\Selfie.jpg";
string imageFilePath = @"C:\Caminho\da\Imagem\Armazenada.png";
A variável “apiUrl” contém a URL da API Kairos para verificação biométrica.
As variáveis “appId” e “appKey” são as credenciais necessárias para autenticar a requisição na API, e é importante que sejam substituídas pelos valores correspondentes de sua conta na Kairos.
“selfieFilePath” e “imageFilePath” armazenam os caminhos para os arquivos de imagem que serão utilizados no processo de validação. É crucial garantir que esses caminhos estejam corretos e que as imagens existam para evitar erros durante a execução.
if (!File.Exists(selfieFilePath) || !File.Exists(imageFilePath))
{
Console.WriteLine("Erro: Um ou mais arquivos de imagem não foram encontrados.");
return;
}
Aqui, realizamos uma verificação para garantir que os arquivos de imagem especificados existam. Se qualquer um dos arquivos não for encontrado, vamos exibir uma mensagem de erro, e o programa será encerrado. Essa etapa é importante para evitar que a aplicação falhe mais adiante ao tentar acessar arquivos inexistentes.
using (var client = new HttpClient())
{
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri(apiUrl),
Headers =
{
{ "app_id", appId },
{ "app_key", appKey },
},
Content = new MultipartFormDataContent
{
// Adiciona a selfie do usuário
new StreamContent(File.OpenRead(selfieFilePath))
{
Headers =
{
ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
Name = "selfie",
FileName = Path.GetFileName(selfieFilePath),
}
}
},
// Adiciona a imagem armazenada
new StreamContent(File.OpenRead(imageFilePath))
{
Headers =
{
ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
Name = "image",
FileName = Path.GetFileName(imageFilePath),
}
}
},
},
};
Neste bloco criamos uma instância do “HttpClient”, que será utilizada para enviar a requisição.
Em seguida, configuramos um “HttpRequestMessage”, definindo o método HTTP como POST e especificando a URL da API.
Os cabeçalhos de autenticação são adicionados utilizando “app_id” e “app_key”.
O conteúdo da requisição é um “MultipartFormDataContent”, que permite enviar múltiplos arquivos como parte da requisição. Aqui, utilizamos “StreamContent” para ler os arquivos de imagem diretamente do sistema de arquivos. Os cabeçalhos “ContentDisposition” são configurados para cada arquivo, especificando o nome do campo e o nome do arquivo, o que é necessário para a API entender quais dados estão sendo enviados.
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}
Por fim, vamos enviar a requisição utilizando o método “SendAsync” do “HttpClient”. Após enviar a requisição, usamos “EnsureSuccessStatusCode” para garantir que a resposta da API foi bem-sucedida. Caso contrário, uma exceção será lançada. Em seguida, lemos o corpo da resposta e o exibimos no console.
A resposta da API será algo semelhante a isso. Vamos entender os principais campos deste json:
{
"api_req_uid": "2f960394-96c9-4403-b34d-92b1e33f7b7c",
"processed_at": "2024-10-02 02:50:30",
"requested_at": "2024-10-02 02:50:30",
"response_code": 0,
"response_data": {
"biometric": {
"image": {
"faces_match_confidences": [
1.0
],
"faces_predicted": [
{
"confidence": 0.9357,
"delta": {
"x": 199.7969,
"y": 233.3345
},
"top_left": {
"x": 233.5239,
"y": 162.5957
}
}
],
"img": {
"height": 480,
"width": 640
}
},
"max_facematch_confidence": 1.0,
"selfie": {
"faces_liveness": 1.0,
"faces_predicted": [
{
"confidence": 1.0,
"delta": {
"x": 161.1886,
"y": 219.9249
},
"top_left": {
"x": 297.8376,
"y": 196.7119
}
}
],
"img": {
"height": 799,
"width": 735
}
}
},
"decision": {
"details": [],
"reject_score": 0.0,
"review_score": 0.0,
"warning_score": 0.0
}
}
}
response_code: Indica o status da resposta. Um código 0 geralmente significa que a solicitação foi processada com sucesso, sem erros.
faces_match_confidences: Um array que armazena as pontuações de confiança da correspondência entre os rostos detectados na imagem submetida e na selfie. Neste exemplo, a confiança máxima foi de 1.0, indicando uma correspondência precisa.
faces_liveness: Indica a verificação de vivacidade da selfie, ou seja, se a imagem foi tirada de uma pessoa viva. Um valor de 1.0 significa que a vivacidade foi confirmada com sucesso.
reject_score: Indica a pontuação de rejeição da verificação. Um valor 0.0 significa que a verificação foi bem-sucedida.
review_score e warning_score: Pontuações que indicam se há necessidade de revisão manual ou algum aviso relacionado ao processo de verificação. No exemplo, ambas estão em 0.0, sugerindo que não há problemas ou necessidade de revisão.
Em casos onde a verificação não é bem-sucedida, o sistema pode gerar uma decisão negativa, como no exemplo a seguir:
"decision":{
"details":[
{
"code":"FAILED_FACE_MATCH",
"confidence":1.0,
"decision":"reject",
"description":"Faces do not match; threshold failed: 0.2285; x < 0.4"
}
],
"reject_score":1.0,
"review_score":0.0,
"warning_score":0.0
}
Neste exemplo, o sistema retorna um “reject_score” de 1.0, indicando que a verificação foi rejeitada. A descrição informa que “Os rostos não correspondem; limite falhou: 0.2285; x < 0.4”, o que significa que a pontuação de semelhança foi inferior ao limite necessário (0.4). Isso resultou em uma decisão negativa, pois semelhanças abaixo de 0.4 são consideradas insuficientes para validar a correspondência entre os rostos.
Acelere a sua carreira conosco!
Se você é Desenvolvedor .NET Júnior e quer acelerar sua carreira até nível Pleno com salário de R$7k+, ou mesmo busca a primeira vaga, conheça a Mentoria .NET Start: Clique aqui Se é Desenvolvedor .NET Pleno ou Sênior e quer virar referência técnica em sua equipe e mercado, com salário de R$10k+, conheça a Mentoria .NET Expert: Clique aquiConclusão
A validação biométrica está se tornando cada vez mais essencial em diversos cenários, especialmente quando falamos de segurança e eficiência na identificação de pessoas. Utilizando a API Kairos, conseguimos integrar de forma simples e eficaz a validação facial em sistemas .NET, como demonstramos neste artigo com um exemplo do sistema de registro de ponto. Além de tornar os processos mais ágeis, essa tecnologia garante maior precisão e segurança, reduzindo fraudes e simplificando a autenticação.