Flutter身份验证插件verifai_sdk的使用
Flutter身份验证插件verifai_sdk的使用
Verifai Flutter SDK 是官方为 Verifai 移动(iOS 和 Android)SDK 提供的 Flutter 包。Verifai 提供了无缝的身份验证解决方案,易于实现和定制,并且考虑到了最高的隐私和安全标准。它能够轻松地集成到移动和 Web 应用程序中。
目录
开始使用
如果您是 Flutter 新手,请查看他们的指南以了解如何设置您的环境。否则,我们可以直接开始安装 Verifai。
安装 Verifai
要将 SDK 集成到项目中,请运行以下命令:
flutter pub add verifai_sdk
这将在您的 pubspec.yaml
文件中添加它。更多详细信息可以在上方的安装标签中找到。
添加许可证
Verifai SDK 在没有有效许可证的情况下无法工作。许可证可以从仪表板复制,并通过 <code>CoreApi</code>
的 <code>setLicence</code>
方法设置,见使用。
许可证可以通过我们的 仪表板 创建。您需要有一个解决方案,并为 iOS 和 Android 各添加一个实现。请确保标识符与您在应用程序中使用的 bundle identifier(iOS)和 package name(Android)相同。
一种将许可证存储在外版本控制之外的方法是将其复制到与 <code>main.dart</code>
相邻的本地 <code>licence.dart</code>
文件中。将其添加到 <code>.gitignore</code>
文件中。它可能看起来像这样:
var verifaiLicence = '''=== Verifai Licence file V2 ===
VQUHzC3sNld8uy8pBHMTFtLxrItlQlkL+7wX3QdVi3tFlXgxUnJhqPD510hLplCxp83o6gwOftCm
...
...
HF/w/+n6SRQso55nIQSUX8uYP8WpJVmi+Gi9aA==''';
然后像这样在 <code>main.dart</code>
中导入许可证变量:
import 'licence.dart';
Android 配置
为了让 SDK 找到本机 Android 库,在根目录的 <code>build.gradle</code>
文件中添加 Verifai Maven 存储库:
allprojects {
repositories {
maven { url 'https://dashboard.verifai.com/downloads/sdk/maven/' }
}
}
为了避免本机 Android 运行时库之间的冲突,在 <code>app</code>
的 <code>build.gradle</code>
文件中添加 <code>packagingOptions</code>
代码片段,而不是在根目录中添加!
android {
packagingOptions {
jniLibs {
pickFirsts += ['**/*.so']
}
}
}
如果在构建应用过程中遇到内存错误,请取消注释(或如果不存在则添加)以下行在您的 gradle.properties
文件中:
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
iOS 配置
iOS 所需的所有依赖项都由 Flutter 处理。因此,只要您运行了 <code>flutter pub get</code>
,所有本机依赖项都应该已经安装。
使用
SDK 有三个模块:
- 核心:核心扫描功能
- NFC:对文档进行 NFC 扫描(需要兼容设备)
- 活体检测:执行活体检测并可选地执行面部匹配检查
核心
这是一个如何运行最基础的核心功能的例子:
import 'package:verifai_sdk/verifai_sdk.dart';
// 导入许可证变量,该变量存储在一个本地的不在版本控制中的 `licence.dart` 文件中
import 'licence.dart';
// 当核心模块完成,操作被取消或出现错误时,这些监听器将处理返回的对象。成功监听器中的结果对象符合 `CoreResult` 对象。图像结果已重新设计为可以理解的 React Native 格式。有关更多信息,请参阅文档。
// 首先设置监听器,一个好的方法是定义一个继承自 Flutter 的 `ChangeNotifier` 的类。
// 在示例文件夹中,您可以看到一个例子。
class CoreResultImpl with ChangeNotifier implements CoreResultApi {
CoreResultImpl() {
CoreResultApi.setup(this);
}
var _data = CoreResult();
CoreResult get data => _data;
set data(CoreResult value) {
print(value.mrzData?.firstName);
print(value.mrzData?.lastName);
_data = value;
notifyListeners();
}
[@override](/user/override)
void onSuccess(CoreResult result) {
data = result;
}
[@override](/user/override)
void onCancelled() {
print('cancelled');
}
[@override](/user/override)
void onError(String message) {
throw Exception(message);
}
}
// 定义核心 API 实现
var api = CoreApi();
// 设置许可证(更多信息在文档中)
// `verifaiLicence` 变量在上面提到的 `licence.dart` 文件中定义
await api.setLicence(verifaiLicence);
// 您可以配置 SDK 的许多方面,请查阅文档或继续阅读此 README 以获取更多信息。首先我们只做些非常简单的事情。
api.configure(Configuration(enableVisualInspection: true));
// 启动 SDK,这会将 SDK 显示在屏幕上。结果将通过监听器返回。
await api.start();
NFC
让我们看一个如何运行最基础的 NFC 功能的例子。NFC 模块只能在核心模块执行扫描后运行。
// 当核心模块完成,操作被取消或出现错误时,这些监听器将处理返回的对象。成功监听器中的结果对象符合 `NfcResult` 对象。图像结果已重新设计为可以理解的 React Native 格式。有关更多信息,请参阅文档。
// 首先设置监听器,一个好的方法是定义一个继承自 Flutter 的 `ChangeNotifier` 的类。
// 在示例文件夹中,您可以看到一个例子。
class NfcResultImpl with ChangeNotifier implements NfcResultApi {
NfcResultImpl() {
NfcResultApi.setup(this);
}
var _data = NfcResult();
NfcResult get data => _data;
set data(NfcResult value) {
_data = value;
notifyListeners();
}
[@override](/user/override)
void onSuccess(NfcResult result) {
data = result;
}
[@override](/user/override)
void onCancelled() {
print('cancelled');
}
[@override](/user/override)
void onError(String message) {
print(message);
throw Exception(message);
}
}
// 现在我们可以启动 NFC SDK。这将呈现扫描屏幕。有一些事情我们可以在启动 NFC 检查时设置以查看完整的列表,请查阅文档。重要的是:为了 NFC 检查正常工作,必须先执行核心扫描。
var api = NfcApi();
var coreData = context.read<CoreResultImpl>().data;
if (coreData.mrzData != null) {
await api.start(NfcConfiguration(retrieveImage: true), coreData);
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const NfcResult()),
);
} else {
print("No core result mrz data");
}
活体检测
这是如何运行最基本的活体检测功能的一个例子。活体检测模块只能在核心模块执行扫描后运行。另外,您需要确保在运行活体检测模块之前许可证已被核心模块设置。
// 当核心模块完成或出现错误时,这些监听器将处理返回的对象。成功监听器中的结果对象符合 `LivenessResult` 对象。图像结果已重新设计为可以理解的 React Native 格式。有关更多信息,请参阅文档。
// 首先设置监听器,一个好的方法是定义一个继承自 Flutter 的 `ChangeNotifier` 的类。
// 在示例文件夹中,您可以看到一个例子。
class LivenessResultImpl with ChangeNotifier implements LivenessResultApi {
LivenessResultImpl() {
LivenessResultApi.setup(this);
}
var _data = LivenessResult();
LivenessResult get data => _data;
set data(LivenessResult value) {
_data = value;
notifyListeners();
}
[@override](/user/override)
void onSuccess(LivenessResult result) {
data = result;
print(result.automaticChecksPassed);
print(result.successRatio);
print(result.resultList);
}
[@override](/user/override)
void onError(String message) {
print(message);
throw Exception(message);
}
}
// 现在我们可以启动活体检测,这会显示活体检测屏幕。有一些事情我们可以在启动活体检测时设置以查看完整的列表,请查阅文档。重要的是:为了活体检测正常工作,必须先执行主要扫描
var api = LivenessApi();
var checks = [
LivenessCheck(type: LivenessCheckType.closeEyes, args: {"numberOfSeconds": 3}),
LivenessCheck(type: LivenessCheckType.tilt, args: {"faceAngleRequirement": 25}),
];
var image = context.read<CoreResultImpl>().data.frontImage;
if (image != null) {
checks.add(LivenessCheck(
type: LivenessCheckType.faceMatching,
args: {"documentImage": image}));
}
api.start(LivenessConfiguration(showDismissButton: true, checks: checks));
自定义
每个模块都有广泛的自定义选项来控制 SDK 的行为。您可以自定义扫描时的各种选项,扫描帮助指令,预扫描指令。您还可以自定义允许哪些类型的文档,或者过滤用户可以选择的选项。
有关详细信息,请参阅我们的 文档。
以下是一些组件设置的示例,让您了解可以设置的内容。
核心设置
核心提供了几个设置,使您能够更好地设置 SDK 并控制用户获得的流程。
以下是您可以设置的一些示例,您可以根据自己的需求自定义这些设置。有关每个设置的详细解释,请查阅我们的文档。您可以在创建 <code>Configuration</code>
对象时设置这些值。然后,您可以通过 <code>CoreApi</code>
的 <code>configure</code>
方法将此对象发送给 SDK。
Configuration(
requireDocumentCopy: true,
enablePostCropping: true,
enableManual: true,
requireMrzContents: false,
requireNfcWhenAvailable: false,
readMrzContents: true,
documentFiltersAutoCreateValidators: true,
customDismissButtonTitle: null,
requireCroppedImage: true,
enableVisualInspection: true
);
核心 - 指令屏幕
有几种方法可以自定义指令屏幕。最简单的方法是使用我们自己的设计但自定义值本身,将这些值放在 <code>Configuration</code>
对象中:
Configuration(
enableVisualInspection: true,
instructionScreenConfiguration: InstructionScreenConfiguration(
showInstructionScreens: true,
instructionScreens: [
InstructionScreen(
screen: InstructionScreenId.mrzPresentFlowInstruction,
type: InstructionScreenType.media,
// 媒体类型指令屏幕的值
title: "自定义指令",
continueButtonLabel: "让我们开始吧!",
header: "观看下面的视频",
mp4FileName: "DemoMp4", // 此文件需要在您的主包中可用
instruction: "这是您可以提供的自定义指令文本。在这个例子中,我们正在自定义请求文档是否具有 MRZ(机器可读区)的屏幕。所以文档是否有 MRZ?请在下面回答。"
)
],
)
);
您也可以使用基于网络的指令屏幕:
Configuration(
enableVisualInspection: true,
instructionScreenConfiguration: InstructionScreenConfiguration(
showInstructionScreens: true,
instructionScreens: [
InstructionScreen(
screen: InstructionScreenId.mrzPresentFlowInstruction,
type: InstructionScreenType.web,
title: "自定义基于网络的指令",
continueButtonLabel: "让我们开始吧!",
url: "https://www.verifai.com/en/support/supported-documents/"
)
],
)
);
有关确切选项和可能值的详细信息,请参阅我们的文档。
NFC - 指令屏幕
也可以设置 NFC 的指令屏幕。
最简单的方法是使用我们自己的设计但自定义值本身,当调用 NFC 模块的启动函数时放置这些值:
// 设置 NFC 指令屏幕,请查阅文档以获取更多信息
NfcConfiguration(retrieveImage: true,
instructionScreenConfiguration:
NfcInstructionScreenConfiguration(showInstructionScreens: true,
instructionScreens: [
NfcInstructionScreen(
screen: NfcInstructionScreenId.nfcScanFlowInstruction,
type: InstructionScreenType.media,
title: "自定义 NFC 指令",
continueButtonLabel: "让我们开始吧!",
header: "观看下面的视频",
mp4FileName: "DemoMp4", // 此文件需要在您的主包中可用
instruction: "美国护照的 NFC 芯片位置非常特别。您需要打开小册子并在背面寻找一张看起来像太空船的图片(旅行者航天器)。将设备的顶部后部迅速放在那张图片上以开始 NFC 扫描过程。",
)
]
),
);
您也可以使用基于网络的指令屏幕:
// 设置 NFC 指令屏幕,请查阅文档以获取更多信息
NfcConfiguration(retrieveImage: true,
instructionScreenConfiguration:
NfcInstructionScreenConfiguration(showInstructionScreens: true,
instructionScreens: [
NfcInstructionScreen(
screen: NfcInstructionScreenId.nfcScanFlowInstruction,
type: InstructionScreenType.media,
title: "自定义 NFC 指令",
continueButtonLabel: "让我们开始吧!",
url: "https://www.verifai.com/en/support/supported-documents/",
)
]
),
);
扫描帮助
当扫描失败或检测到用户难以扫描时,我们会提供帮助屏幕,以向用户提供更详细的扫描信息。
对于核心模块,我们还提供了一个可选的回退选项,以便在其他一切失败时,用户至少可以拍摄文档的照片,由人类手动处理。对于扫描帮助,您可以配置显示给用户的指令和视频。请注意,视频是静音的。
您可以通过以下方式自定义此屏幕,在设置核心模块时将这些值放入 <code>Configuration</code>
对象中:
// 设置扫描帮助,当扫描失败时会显示扫描帮助,请查阅文档以获取更多信息
Configuration(scanHelpConfiguration:
ScanHelpConfiguration(
showScanHelp: true,
customScanHelpScreenInstructions: "我们的自定义指令",
customScanHelpScreenMp4FileName: "DemoMp4"
)
);
在 NFC 模块中,当 NFC 扫描失败时我们也提供扫描帮助。对于扫描帮助,您可以配置显示给用户的指令和视频。请注意,视频是静音的。
您可以通过以下方式自定义此屏幕,在 NFC 模块的配置中放置这些值:
// 设置扫描帮助,当 NFC 扫描失败时会显示扫描帮助,请查阅文档以获取更多信息
NfcConfiguration(
scanHelpConfiguration:
ScanHelpConfiguration(
showScanHelp: true,
customScanHelpScreenInstructions: "我们的自定义指令",
customScanHelpScreenMp4FileName: "DemoMp4"
)
);
验证器
就像本机 SDK 一样,我们已经通过 Flutter 包开放了设置验证器的可能性。有关验证器是什么的详细解释,请参阅我们的主要文档。目前我们不提供通过桥接设置自定义验证器的选项。该包提供了以下验证器类型访问权限:
// 描述文档验证器类型的枚举
enum ValidatorType {
countryAllowlist, // 仅允许来自所提供的国家的文档的验证器
countryBlocklist, // 阻止来自所提供的国家的文档的验证器
hasMrz, // 检查文档是否有 MRZ 的验证器
documentTypes, // 仅验证某些文档类型的验证器
mrzAvailable, // 需要 MRZ 正确的验证器
nfcKeyWhenAvailable, // 确保如果可用 NFC 键正确的验证器
}
在下面的示例中,我们作为示例设置了每种验证器。请注意,如果设置不当,验证器可能会相互抵消。例如,将相同的国家添加到允许和阻止列表中。
// 验证器示例
Configuration(
validators: [
Validator(
type: ValidatorType.countryAllowlist,
args: {
"countryList": ["NL"]
}
),
Validator(
type: ValidatorType.countryBlocklist,
args: {
"countryList": ["BE"]
}
),
Validator(
type: ValidatorType.hasMrz
),
Validator(
type: ValidatorType.documentTypes,
args: {
"validDocumentTypes": [
DocumentType.driversLicence.index,
DocumentType.passport.index
]
}
),
Validator(
type: ValidatorType.mrzAvailable
),
Validator(
type: ValidatorType.nfcKeyWhenAvailable
),
]
);
文档过滤器
我们还通过 Flutter 包开放了设置文档过滤器的可能性。文档过滤器允许您控制用户在使用 SDK 的手动流程时可以选择哪些文档。有关此的更多信息,请参阅文档。
我们提供了以下文档过滤器:
// 描述文档过滤器的枚举,该过滤器过滤手动文档选择流程中的可用文档
enum DocumentFilterType {
documentTypeAllowList, // 仅允许某些文档类型的过滤器
documentAllowList, // 仅允许来自某些提供的国家的文档的过滤器
documentBlockList, // 阻止某些文档国家的过滤器
}
这是一个如何设置文档过滤器的示例,在配置核心模块时传递这些值:
// 设置文档过滤器示例
Configuration(
documentFilters: [
DocumentFilter(type: DocumentFilterType.documentAllowList,
args: {
"countryList": ["NL"]
}
),
DocumentFilter(type: DocumentFilterType.documentBlockList,
args: {
"countryList": ["BE"]
}
),
DocumentFilter(type: DocumentFilterType.documentTypeAllowList,
args: {
"validDocumentTypes": [
DocumentType.passport.index,
DocumentType.idCard.index
]
}
)
]
);
活体检查
我们还提供了 SDK 提供的活体检查的桥接。以下是可以进行的活体检查:
// 描述可能的活体检查的枚举
enum LivenessCheckType {
closeEyes, // 要求用户在一定时间内闭眼的检查
tilt, // 要求用户倾斜头部一定角度的检查
speech, // 要求用户说某些词的检查
faceMatching, // 要求用户拍摄自拍照并将面部与文档或 NFC 上的面部进行匹配的检查
}
以下是一个每个活体检查的示例,您可以根据需要配置值或只是传递一个空列表,SDK 将使用默认的一组检查。
您可以通过在启动活体检查时传递 <code>LivenessConfiguration</code>
对象来设置这些值:
LivenessConfiguration(
checks: [
LivenessCheck(
type: LivenessCheckType.closeEyes,
args: {"numberOfSeconds": 3}
),
LivenessCheck(
type: LivenessCheckType.tilt,
args: {"faceAngleRequirement": 5}
),
LivenessCheck(
type: LivenessCheckType.speech,
args: {
"speechRequirement": "Apple Banana Pizza"
}
),
LivenessCheck(
type: LivenessCheckType.faceMatching,
args: {"documentImage": image}
)
]
);
支持
如需额外支持,请查阅我们的主要文档或通过我们的支持渠道联系我们。
示例
在实现 SDK 时,您需要了解的主要概念是 Verifai SDK 的生命周期。
SDK 的生命周期可以简化为以下基本步骤:
- SDK 设置
- 运行 SDK
- 结果处理
设置
在可以进行任何扫描之前,我们需要设置 SDK。SDK 的许多功能都有默认值。因此,主要需要设置的是许可证。在示例中,我们将许可证添加到 Dart 文件中。最好将许可证保存在单独的文件中,并将其排除在版本控制之外。这样泄露许可证的机会就很小。
所以我们创建一个 licence.dart
文件中的变量,然后将其导入到 main.dart
(或其他任何设置许可证的地方)。
这里是如何将许可证放入 licence.dart
文件中的示例,请注意,您需要将与您的 iOS bundle identifier 和 Android package name 匹配的许可证放入其中。此许可证在您创建解决方案后可在我们的仪表板中获得。有关更多信息,请参阅主 README。
var verifaiLicence = '''=== Verifai Licence file V2 ===
VQUHzC3sNld8uy8pBHMTFtLxrItlQlkL+7wX3QdVi3tFlXgxUnJhqPD510hLplCxp83o6gwOftCm
...
...
...
YMInt2Wk0N9ggwcZCymW4q6pcAUtL4Y8eV2A+sRA8BybdhuqY1r50ZURQD51nnDPvABEQLwcB31R
HF/w/+n6SRQso55nIQSUX8uYP8WpJVmi+Gi9aA==''';
确保导入:
import 'package:verifai_sdk/verifai_sdk.dart';
import 'licence.dart';
许可证可以这样设置:
var api = CoreApi();
await api.setLicence(verifaiLicence);
核心配置
核心的设置是通过设置其 <code>Configuration</code>
对象完成的。配置对象中的所有值都有默认值。因此,如果您只想快速使用 SDK,则可以跳过此步骤。所有配置选项都在我们的文档和 SDK 的主 README 中定义。
由于所有值都有默认值,因此只需更改默认值的值即可:
api.configure(Configuration(
enablePostCropping: true,
enableVisualInspection: true,
enableManual: false,
));
注意:这里的 api 是在许可证设置步骤中定义的 <code>CoreApi</code>
对象。
NFC 配置
NFC 是通过设置其 <code>NfcConfiguration</code>
对象来配置的。此对象是在启动 NFC SDK 时传递的值之一。有关所有配置选项,请参阅主 README 文件。
例如,设置 NFC 检查以检索文档持有人照片的副本:
var NfcConfiguration = NfcConfiguration(retrieveImage: true);
活体配置
活体检查设置是通过设置 <code>LivenessConfiguration</code>
对象中的值完成的。就像 NFC SDK 一样,此值在启动活体检查时传递。您可以在启动活体检查时控制的主要事情之一是执行的检查。有关所有选项,请参阅主 README 文件。
var checks = [
LivenessCheck(
type: LivenessCheckType.closeEyes, args: {"numberOfSeconds": 3}),
LivenessCheck(
type: LivenessCheckType.tilt, args: {"faceAngleRequirement": 5}),
];
var livenessConfiguration = LivenessConfiguration(showDismissButton: false, checks: checks);
运行 SDK
一旦一切都按您希望的方式设置好了,那么运行 SDK 就是一个简单的过程。每个 SDK 都有一个启动函数,NFC 和活体模块允许传递配置选项。
NFC 和活体模块还需要一些额外的信息才能从核心扫描中运行。
启动核心模块
一旦设置了许可证,那么运行 SDK 就像这样简单:
await api.start();
注意:这里的 api 是在许可证设置步骤中定义的 <code>CoreApi</code>
对象。
启动 NFC 模块
当启动 NFC 模块时,您需要传递来自核心扫描的结果。正如前面提到的,您也可以传递配置对象。有关设置的更多详细信息,请参阅 README。
void _startNfc() async {
var api = NfcApi();
var coreData = context.read<CoreResultImpl>().data;
if (coreData.mrzData != null) {
await api.start(NfcConfiguration(retrieveImage: true), coreData);
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const NfcResult()),
);
} else {
print("No core mrz data");
}
}
启动活体模块
当启动活体模块时,您可以自定义正在进行的检查。如果您选择执行面部匹配检查,则需要传递用户的面部图像以与自拍照进行比较。有关设置的更多详细信息,请参阅 README。
void _startLiveness() async {
var api = LivenessApi();
var checks = [
LivenessCheck(
type: LivenessCheckType.closeEyes, args: {"numberOfSeconds": 3}),
LivenessCheck(
type: LivenessCheckType.tilt, args: {"faceAngleRequirement": 5}),
];
var image = context.read<CoreResultImpl>().data.frontImage;
if (image != null) {
checks.add(LivenessCheck(
type: LivenessCheckType.faceMatching,
args: {"documentImage": image}));
}
api.start(LivenessConfiguration(showDismissButton: false, checks: checks));
}
结果处理
设置和启动 SDK 之后,SDK 会引导用户完成扫描身份证件的过程。根据用户采取的流程或所需信息的不同,这可能是一个相当快的过程,也可能需要几分钟。特别是因为并非所有用户都能随时拿到证件,他们可能需要查找证件或获取良好的扫描结果。
每个模块都有一个结果 API,当过程完成后会通知其监听器结果。如果有错误发生或过程被取消,也会通知。
在示例应用中,我们在实现这些结果 API 的类中实现了 <code>ChangeNotifier</code>
。这使我们能够在扫描完成后处理结果,并将我们需要的任何数据传递给可能想要消费数据的任何视图。
在示例应用中,您可以在 lib 文件夹中的 <code>modeldata.dart</code>
文件中找到这些类。
核心结果处理示例
// 定义一个将处理传入核心结果的类
class CoreResultImpl with ChangeNotifier implements CoreResultApi {
CoreResultImpl() {
CoreResultApi.setup(this);
}
var _data = CoreResult();
CoreResult get data => _data;
set data(CoreResult value) {
print(value.mrzData?.firstName);
print(value.mrzData?.lastName);
print(value.backDocumentPosition?.bottomRight?.x);
_data = value;
notifyListeners();
}
[@override](/user/override)
void onSuccess(CoreResult result) {
data = result;
}
[@override](/user/override)
void onCancelled() {
print('cancelled');
}
[@override](/user/override)
void onError(String message) {
throw Exception(message);
}
}
NFC 结果处理示例
class NfcResultImpl with ChangeNotifier implements NfcResultApi {
NfcResultImpl() {
NfcResultApi.setup(this);
}
var _data = NfcResult();
NfcResult get data => _data;
set data(NfcResult value) {
_data = value;
notifyListeners();
}
[@override](/user/override)
void onSuccess(NfcResult result) {
data = result;
}
[@override](/user/override)
void onCancelled() {
print('cancelled');
}
[@override](/user/override)
void onError(String message) {
print(message);
throw Exception(message);
}
}
活体结果处理示例
class LivenessResultImpl with ChangeNotifier implements LivenessResultApi {
LivenessResultImpl() {
LivenessResultApi.setup(this);
}
var _data = LivenessResult();
LivenessResult get data => _data;
set data(LivenessResult value) {
_data = value;
notifyListeners();
}
[@override](/user/override)
void onSuccess(LivenessResult result) {
data = result;
print(result.automaticChecksPassed);
print(result.successRatio);
print(result.resultList);
}
[@override](/user/override)
void onError(String message) {
print(message);
throw Exception(message);
}
}
更多关于Flutter身份验证插件verifai_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter身份验证插件verifai_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用verifai_sdk
插件进行身份验证的代码示例。请注意,实际使用时需要根据verifai_sdk
的官方文档和最新版本进行调整。
首先,确保你已经在pubspec.yaml
文件中添加了verifai_sdk
依赖:
dependencies:
flutter:
sdk: flutter
verifai_sdk: ^最新版本号 # 替换为实际的最新版本号
然后,运行flutter pub get
来获取依赖。
接下来,在你的Flutter项目中,你可以按照以下步骤进行身份验证:
- 导入必要的包:
import 'package:flutter/material.dart';
import 'package:verifai_sdk/verifai_sdk.dart';
- 初始化Verifai SDK:
在应用的入口文件(通常是main.dart
)中初始化Verifai SDK。你需要提供你的API密钥,这通常可以在Verifai的开发者控制台中获取。
void main() {
WidgetsFlutterBinding.ensureInitialized();
Verifai.initialize(apiKey: '你的API密钥');
runApp(MyApp());
}
- 创建一个身份验证屏幕:
下面是一个简单的身份验证屏幕的示例,用户可以在这里进行身份验证。
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: AuthScreen(),
);
}
}
class AuthScreen extends StatefulWidget {
@override
_AuthScreenState createState() => _AuthScreenState();
}
class _AuthScreenState extends State<AuthScreen> {
String _authResult = '';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Verifai SDK 身份验证'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'点击按钮进行身份验证',
style: TextStyle(fontSize: 20),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
try {
// 触发身份验证流程
var result = await Verifai.authenticate();
setState(() {
_authResult = '身份验证成功: ${result.toJson()}';
});
} catch (e) {
setState(() {
_authResult = '身份验证失败: ${e.message}';
});
}
},
child: Text('身份验证'),
),
SizedBox(height: 20),
Text(
_authResult,
style: TextStyle(fontSize: 18),
),
],
),
),
);
}
}
在这个示例中,当用户点击“身份验证”按钮时,会触发Verifai.authenticate()
方法,该方法将启动身份验证流程。验证结果(成功或失败)将显示在屏幕上。
注意:
- 确保你已经在Verifai开发者控制台中正确配置了你的应用,并获取了有效的API密钥。
- 根据你的具体需求,你可能需要处理更多的身份验证结果,比如用户信息、令牌等。
verifai_sdk
的API可能会随着版本更新而变化,请参考最新的官方文档进行调整。
这个示例提供了一个基本的框架,你可以根据实际需求进行扩展和定制。