Flutter身份验证插件verifai_sdk的使用

发布于 1周前 作者 sinazl 来自 Flutter

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

1 回复

更多关于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项目中,你可以按照以下步骤进行身份验证:

  1. 导入必要的包
import 'package:flutter/material.dart';
import 'package:verifai_sdk/verifai_sdk.dart';
  1. 初始化Verifai SDK

在应用的入口文件(通常是main.dart)中初始化Verifai SDK。你需要提供你的API密钥,这通常可以在Verifai的开发者控制台中获取。

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  Verifai.initialize(apiKey: '你的API密钥');
  runApp(MyApp());
}
  1. 创建一个身份验证屏幕

下面是一个简单的身份验证屏幕的示例,用户可以在这里进行身份验证。

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可能会随着版本更新而变化,请参考最新的官方文档进行调整。

这个示例提供了一个基本的框架,你可以根据实际需求进行扩展和定制。

回到顶部