passive_face_liveness 4.28.1
passive_face_liveness: ^4.28.1 copied to clipboard
Flutter plugin cross-platform (iOS, Android) for Combate à Fraude's PassiveFaceLiveness (https://github.com/combateafraude).
PassiveFaceLiveness - Flutter Plugin #
Plugin que chama os SDKs nativos em Android e iOS. Caso tenha alguma dúvida, envie um email para o nosso Head of Mobile
Políticas de privacidade e termos e condições de uso #
Ao utilizar nosso plugin, certifique-se que você concorda com nossas Políticas de privacidade e nossos Termos e condições de uso.
Pré requisitos #
| Configuração mínima | Versão |
|---|---|
| Flutter | 1.12+ |
| Dart | 2.12+ |
| Android API | 21+ |
| iOS | 11.0+ |
Caso você utilize Dart em uma versão abaixo de 2.12, confira a versão compatível aqui.
Configurações #
Android #
No arquivo ROOT_PROJECT/android/app/build.gradle, adicione:
android {
...
dataBinding.enabled = true
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
iOS #
No arquivo ROOT_PROJECT/ios/Podfile, adicione no final do arquivo:
source 'https://github.com/combateafraude/iOS.git'
source 'https://cdn.cocoapods.org/' # ou 'https://github.com/CocoaPods/Specs' se o CDN estiver fora do ar
Por último, adicione a permissão de câmera no arquivo ROOT_PROJECT/ios/Runner/Info.plist:
<key>NSCameraUsageDescription</key>
<string>To capture the selfie</string>
Para habilitar texto e voz em Português, em seu projeto, no diretório ROOTPROJECT/ios, abra o arquivo .xcworkspace no Xcode e adicione em Project > Info > Localizations o idioma Portuguese (Brazil).
Flutter #
Adicione o plugin no seu arquivo ROOT_PROJECT/pubspec.yaml:
Estável
dependencies:
passive_face_liveness:
git:
url: https://github.com/combateafraude/Flutter.git
ref: passive-face-liveness-v4.28.1
Release Candidate
dependencies:
passive_face_liveness:
git:
url: https://github.com/combateafraude/Flutter.git
ref: passive-face-liveness-v4.28.0-rc01
Utilização #
PassiveFaceLiveness passiveFaceLiveness = new PassiveFaceLiveness(mobileToken: mobileToken);
// Outros parâmetros de customização
PassiveFaceLivenessResult passiveFaceLivenessResult = await passiveFaceLiveness.start();
if (passiveFaceLivenessResult is PassiveFaceLivenessSuccess) {
// O SDK foi encerrado com sucesso e a selfie foi capturada
} else if (passiveFaceLivenessResult is PassiveFaceLivenessFailure) {
// O SDK foi encerrado devido à alguma falha e a selfie não foi capturada
} else {
// O usuário simplesmente fechou o SDK, sem nenhum resultado
}
Desativando validações de segurança para teste #
Estamos constantemente realizando ações para tornar o produto cada vez mais seguro, mitigando uma série de ataques observados ao processo de captura e, consequentemente, reduzindo o maior número de possíveis fraudes de identidade. O SDK possui alguns bloqueios que podem impedir a execução em certos contextos. Para desabilitá-los, você pode utilizar os métodos conforme o exemplo abaixo:
PassiveFaceLivenessAndroidSettings androidSettings =
PassiveFaceLivenessAndroidSettings(
emulatorSettings: true,
rootSettings: true,
useDeveloperMode: true,
useAdb: true,
useDebug: true,
);
passiveFaceLiveness.setAndroidSettings(androidSettings);
Atenção! Desabilitar as validações de segurança são recomendadas apenas para ambiente de testes. Para publicação do seu aplicativo em produção, recomendamos utilizar as configurações padrão.
Customizações gerais #
| PassiveFaceLiveness |
|---|
.setPeopleId(String peopleId)CPF do usuário que está utilizando o plugin à ser usado para detecção de fraudes via analytics |
.setPersonName(String personName)Vincula uma tentativa de prova de vida a um nome |
.setPersonCPF(String personCPF)Vincula uma tentativa de prova de vida a um cpf |
.setAnalyticsSettings(bool useAnalytics)Habilita/desabilita a coleta de dados para maximização da informação antifraude. O padrão é true |
.setAudioSettings(bool enable, String audioResIdName)Habilita/desabilita os sons. Permite customizar o áudio utilizado pelo SDK. Caso deseje mudar o áudio do SDK, adicione o arquivo de audio em ROOT_PROJECT/android/app/src/main/res/raw/ com o nome desejado seguindo e o parametrize |
.setShowPreview(ShowPreview showPreview)Preview para verificação de qualidade da foto |
.setCaptureMode(VideoCapture videoCapture, ImageCapture imageCapture)Define as configurações de captura |
.setGetImageUrlExpireTime(String expireTime)Define o tempo de duração da URL da imagem no servidor até ser expirada. Espera receber um intervalo de tempo entre "30m" à "30d". O padrão é 3h |
.setMessageSettings(MessageSettings messageSettings)Permite personalizar as mensagens exibidas no balão de "status" durante o processo de captura e análise |
.setCurrentStepDoneDelay(bool showDelay, int delay)Aplica delay na activity após a finalização de cada etapa. Esse método pode ser utilizado para exibir uma mensagem de sucesso na própria tela após a captura, por exemplo. O padrão é false |
.setAndroidSettings(PassiveFaceLivenessAndroidSettings androidSettings)Customizações somente aplicadas em Android |
.setIosSettings(PassiveFaceLivenessIosSettings iosSettings)Customizações somente aplicadas em iOS |
.setEyesClosedSettings(bool enable, double threshold)Permite customizar a validação de olhos abertos no SDK |
.setCaptureProcessingErrorMessage(@NonNull @StringRes Integer message)Permite customizar a mensagem exibida quando ocorre um problema no processamento ou erro na response da API. |
| ImageCapture constructor |
|---|
bool useHabilita/desabilita a captura de um frame. O padrão é true |
int beforePictureMillisDuração em milissegundos entre a primeira detecção do rosto e a efetiva captura da foto. O padrão é 0 ms |
int afterPictureMillisDuração em milissegundos entre a captura da foto e o envio para o servidor para o mantimento do rosto e dos sensores válidos. O padrão é 2000 ms |
| VideoCapture constructor |
|---|
bool useHabilita/desabilita a captura por vídeo. O padrão é false |
int timeEstabelece o tempo do vídeo que será capturado. O padrão é 3s |
| ShowPreview |
|---|
bool showHabilita/Desabilita preview |
String titleTítulo |
String subTitleSubtítulo |
String confirmLabelTexto do botão de confirmação |
String retryLabelTexto do botão de capturar novamente |
| Exemplo de uso |
ShowPreview showPreview = new ShowPreview(
show: true,
title: "A foto ficou boa?",
subTitle: "Veja se a foto está nítida",
confirmLabel: "Sim, ficou boa!",
retryLabel: "Tirar novamente");
passiveFaceLiveness.setShowPreview(showPreview);
| MessageSettings |
|---|
String stepNamePadrão: "Registro Facial" |
String holdItMessagePadrão: "Segure assim" |
String faceNotFoundMessagePadrão: "Não encontramos nenhum rosto" |
String faceTooFarMessagePadrão: "Aproxime o rosto" |
String faceTooCloseMessage (somente para Android)Padrão: "Afaste o rosto" |
String faceNotFittedMessagePadrão: "Encaixe seu rosto" |
String multipleFaceDetectedMessagePadrão: "Mais de um rosto detectado" |
String verifyingLivenessMessagePadrão: "Verificando selfie…" |
String invalidFaceMessagePadrão: "Ops, rosto inválido. Por favor, tente novamente" |
String? sensorStabilityMessagePadrão: "Mantenha o celular parado" |
String? captureProcessingErrorMessage Padrão: "Ops, tivemos um problema ao processar sua imagem. Tente novamente." |
String multipleFaceDetectedMessagePadrão: "Mais de um rosto detectado" |
String? sensorOrientationMessage (somente para Android)Padrão: "Celular não está na vertical" |
String eyesClosedMessage (somente para Android)Padrão: "Seus olhos estão fechados" |
String notCenterXMessage (somente para Android)Padrão: "Centralize seu rosto na vertical" |
String notCenterYMessage (somente para Android)Padrão: "Centralize seu rosto na horizontal" |
String notCenterZMessage (somente para Android)Padrão: "Seu rosto não está ajustado à máscara" |
| Exemplo de uso |
MessageSettings messageSettings = new MessageSettings(
stepName: "Mensagem de exemplo",
faceNotFoundMessage: "Mensagem de exemplo",
faceTooFarMessage: "Mensagem de exemplo",
faceTooCloseMessage: "Mensagem de exemplo",
faceNotFittedMessage: "Mensagem de exemplo",
multipleFaceDetectedMessage: "Mensagem de exemplo",
verifyingLivenessMessage: "Mensagem de exemplo",
holdItMessage: "Mensagem de exemplo",
invalidFaceMessage: "Mensagem de exemplo");
passiveFaceLiveness.setMessageSettings(messageSettings);
Android
| PassiveFaceLivenessAndroidSettings constructor |
|---|
PassiveFaceLivenessCustomizationAndroid customizationCustomização do layout em Android da activity |
SensorSettingsAndroid sensorSettingsCustomização das configurações dos sensores de captura |
int showButtonTimeAltera o tempo para a exibição do botão de captura manual. O padrão é 20000 milisegundos |
bool enableSwitchCameraButtonPermite habilitar ou desabilitar o botão de inversão da câmera. O padrão é True |
bool enableGoogleServicesPermite habilitar/desabilitar recursos do SDK que consomem GoogleServices no SDK, não recomendamos desabilitar os serviços por conta da perda de segurança. O padrão é True |
bool emulatorSettingsPermite habilitar/desabilitar o uso de dispositivos emulados no SDK. Recomendamos desabilitar o uso dos emuladores por questões de segurança. O padrão é False |
bool rootSettingsPermite habilitar/desabilitar o uso de dispositivos com root no SDK. Recomendamos desabilitar o uso desses dispositivos por questões de segurança. O padrão é False |
bool useDeveloperModePermite habilitar/desabilitar o uso de dispositivos com o modo de desenvolvedor Android ativado. Recomendamos desabilitar o uso desses dispositivos por questões de segurança. O padrão é False |
bool useAdbPermite habilitar/desabilitar o uso do modo de depuração Android Debug Bridge (ADB). Recomendamos desabilitar o uso desses dispositivos por questões de segurança. O padrão é False |
bool useAdbHabilita/desabilita o uso do app em modo depuração. O padrão é False |
bool enableBrightnessIncreaseHabilita/desabilita o incremento de brilho do dispositivo do dispositivo na abertura do SDK |
| PassiveFaceLivenessCustomizationAndroid constructor |
|---|
String styleResIdNameNome do style resource que define as cores do SDK. Por exemplo, caso deseje mudar as cores do SDK, crie um style em ROOT_PROJECT/android/app/src/main/res/values/styles.xml com o nome R.style.my_custom_style seguindo o template e parametrize "my_custom_style" |
String layoutResIdNameNome do layout resource que substituirá o layout padrão do SDK. Por exemplo, caso deseje mudar o layout do SDK, crie um layout em ROOT_PROJECT/android/app/src/main/res/layout/my_custom_layout.xml seguindo o template e parametrize "my_custom_layout" |
String greenMaskResIdNameNome do drawable resource à substituir a máscara verde padrão. Caso for usar este parâmetro, use uma máscara com a mesma área de corte, é importante para o algoritmo de detecção. Por exemplo, salve a imagem da máscara em ROOT_PROJECT/android/app/src/main/res/drawable/my_custom_green_mask.png e parametrize "my_custom_green_mask" |
String redMaskResIdNameNome do drawable resource à substituir a máscara vermelha padrão. Caso for usar este parâmetro, use uma máscara com a mesma área de corte, é importante para o algoritmo de detecção. Por exemplo, salve a imagem da máscara em ROOT_PROJECT/android/app/src/main/res/drawable/my_custom_red_mask.png e parametrize "my_custom_red_mask" |
String whiteMaskResIdNameNome do drawable resource à substituir a máscara branca padrão. Caso for usar este parâmetro, use uma máscara com a mesma área de corte, é importante para o algoritmo de detecção. Por exemplo, salve a imagem da máscara em ROOT_PROJECT/android/app/src/main/res/drawable/my_custom_white_mask.png e parametrize "my_custom_white_mask" |
MaskType maskTypeDefine o tipo de máscara utilizada nas capturas. Existem dois tipos: MaskType.DEFAULT, com o padrão pontilhado e MaskType.NONE, que remove completamente a máscara. O padrão é MaskType.DEFAULT |
| SensorSettingsAndroid constructor |
|---|
SensorStabilitySettingsAndroid sensorStabilitySettingsConfigurações do sensor de estabilidade à ser aplicado em todos os passos do SDK |
SensorOrientationAndroid sensorOrientationAndroidConfigurações do sensor de orientação à ser aplicado em todos os passos do SDK |
| SensorStabilitySettingsAndroid constructor |
|---|
int stabilityStabledMillisQuantos milissegundos o celular deve se manter no limiar correto para ser considerado estável. O padrão é 1500 ms |
double stabilityThresholdLimiar entre estável/instável, em variação de m/s² entre as últimas duas coletas do sensor. O padrão é 0.7 m/s² |
| SensorOrientationAndroid constructor |
|---|
double stabilityThresholdLimiar entre estável/instável, em variação de m/s² entre as últimas duas coletas do sensor. O padrão é 4 m/s² |
iOS
| PassiveFaceLivenessIosSettings constructor |
|---|
PassiveFaceLivenessCustomizationIos customizationCustomização visual do SDK |
int beforePictureMillisDuração em milissegundos entre a primeira detecção do rosto e a efetiva captura da foto |
SensorStabilitySettingsIos sensorStabilityConfigurações do sensor de estabilidade à ser aplicado no SDK |
bool enableManualCaptureHabilita modo de captura manual |
double timeEnableManualCaptureDefine tempo (em segundos) para exibição do botão de captura manual |
double compressionQualityPermite configurar a qualidade no processo de compressão. Por padrão, todas capturas passam por compressão. O método espera como parâmetro valores entre 0 e 1.0, sendo 1.0 a compressão com melhor qualidade (recomendado).O padrão é 1.0 |
String resolutionPermite configurar a resolução de captura. O método espera como parâmetro uma String IosResolution (O padrão é hd1280x720), que possui as seguintes opções: |
| Resolution | Descrição |
|---|---|
low |
Especifica as configurações de captura adequadas para vídeo de saída e taxas de bits de áudio adequadas para compartilhamento em 3G |
medium |
Especifica as configurações de captura adequadas para as taxas de bits de áudio e vídeo de saída adequadas para compartilhamento via WiFi |
high |
Especifica as configurações de captura adequadas para saída de áudio e vídeo de alta qualidade |
photo |
Especifica as configurações de captura adequadas para saída de qualidade de foto de alta resolução |
inputPriority |
Especifica as configurações de captura adequadas para saída de qualidade de foto de alta resolução |
hd1280x720 |
Especifica as configurações de captura adequadas para saída de vídeo com qualidade de 720p (1280 x 720 pixels) |
hd1920x1080 |
Configurações de captura adequadas para saída de vídeo com qualidade 1080p (1920 x 1080 pixels) |
hd4K3840x2160 |
Configurações de captura adequadas para saída de vídeo com qualidade 2160p (3840 x 2160 pixels) |
| PassiveFaceLivenessCustomizationIos constructor |
|---|
String? colorHexCor tema do SDK. Por exemplo, caso deseje usar a cor preta, utilize "#000000" |
String? greenMaskImageNameNome da imagem à substituir a máscara verde padrão. Lembre de adicionar a imagem em Assets Catalog Document no seu projeto do XCode |
String? whiteMaskImageNameNome da imagem à substituir a máscara branca padrão. Lembre de adicionar a imagem em Assets Catalog Document no seu projeto do XCode |
String? redMaskImageNameNome da imagem à substituir a máscara vermelha padrão. Lembre de adicionar a imagem em Assets Catalog Document no seu projeto do XCode |
String? closeImageNameNome da imagem à substituir o botão de fechar o SDK. Lembre de adicionar a imagem em Assets Catalog Document no seu projeto do XCode |
bool? showStepLabelFlag que indica se deseja mostrar o label do passo atual |
bool? showStatusLabelFlag que indica se deseja mostrar o label do status atual |
double? buttonSizeValor que define o tamanho do botão de "fechar" o SDK |
String? buttonContentModeAtributo que define o content mode do botão de "fechar" o SDK. Escolha entre esses valores. |
| SensorStabilitySettingsIos constructor |
|---|
String messageString à ser mostrada quando o celular não estiver estável |
double stabilityThresholdLimiar inferior entre estável/instável, em variação de m/s² entre as últimas duas coletas do sensor. O padrão é 0.3 m/s² |
Coletando o resultado #
O objeto de retorno do PassiveFaceLiveness é do tipo abstrato PassiveFaceLivenessResult. Ele pode ser uma instância de PassiveFaceLivenessSuccess, PassiveFaceLivenessFailure ou PassiveFaceLivenessClosed.
PassiveFaceLivenessSuccess
| Campo |
|---|
String imagePathEndereço completo da imagem no dispositivo |
String capturePathEndereço completo do vídeo no dispositivo. Caso o formato de captura não seja por vídeo, o retorno é null |
String imageUrlURL da imagem armazenada temporariamente nos servidores da CAF |
String signedResponseResposta assinada do servidor da CAF que confirmou que a selfie capturada possui um rosto verdadeiro (não é foto de foto ou vídeo). Utilize esse parâmetro caso queira uma camada extra de segurança verificando se a assinatura da resposta não está quebrada, provocada por uma interceptação da requisição. Se estiver quebrada, há um grande indício de interceptação da requisição |
String trackingIdIdentificador dessa execução em nossos servidores. Se possível, salve este campo e mande-o junto para nossa API. Assim, teremos mais dados de como o usuário se comportou durante a execução |
PassiveFaceLivenessFailure
| Campo |
|---|
String messageMensagem amigável explicando o motivo da falha do SDK |
String typeTipo de falha que encerrou o SDK |
Os tipos de falha existentes são:
InvalidTokenReason: quando o token informado é inválido. Não deve ocorrer em um ambiente de produção;PermissionReason: quando alguma permissão obrigatória não foi concedida pelo usuário. Só ocorrerá em um ambiente de produção se o seu app não solicitar ao seu usuário ou o mesmo desabilitar manualmente antes de iniciar;NetworkReason: falha de conexão com o servidor. Ocorrerá em produção se o dispositivo do usuário estiver sem internet;ServerReason: falha em alguma requisição com nossos servidores. Ocorrerá em produção somente no caso de uma falha nossa;SecurityReason: quando o dispositivo não é seguro para executar o SDK. Se esta falha ocorrer, avise-nos;StorageReason: quando o dispositivo não possui espaço suficiente para a captura de alguma foto. Pode ocorrer em produção;LibraryReason: quando alguma falha interna impossibilitou a execução do SDK. Pode ocorrer devico à erros de configuração do projeto, não deve ocorrer em produção;
Customizando view iOS #
Para customização iOS, é necessário que os plugins Flutter estejam adicionados localmente no projeto. A customizção é realizada nativamente com a abordagem ViewCode.
Clique aqui e acesse o exemplo com um guia para utilização desse recurso.