Flutter身份验证插件tinkoff_id_flutter的使用

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

Flutter身份验证插件tinkoff_id_flutter的使用

Tinkoff ID Native Android 和 iOS SDK 的 Flutter 实现。

特性

该插件允许你:

  • 从 Tinkoff Bank 的 Tinkoff ID 系统接收一组社交令牌。
  • 通过 refreshToken 更新令牌。
  • 退出 Tinkoff ID。

开始使用

Android 需求

  • minSdkVersion >= 21

使用方法

在 Info.plist 中添加配置

为了让应用能够打开 Tinkoff Bank 应用,你需要在 Info.plist 文件中添加以下配置:

<key>LSApplicationQueriesSchemes</key>
<array>
  <string>tinkoffiddebug</string>
  <string>tinkoffbank</string>
</array>

为了让 Tinkoff Bank 应用能够通过链接打开你的应用,你也需要在 Info.plist 文件中添加以下配置:

<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleTypeRole</key>
    <string>Editor</string>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>tru</string>  // scheme
      <string>redirecturi</string> // host
    </array>
  </dict>
</array>

完整示例代码

以下是一个完整的示例代码,展示了如何使用 tinkoff_id_flutter 插件来获取和更新令牌,并进行登出操作。

import 'package:flutter/material.dart';
import 'package:tinkoff_id_flutter/tinkoff_id_flutter.dart';
import 'package:app_links/app_links.dart';

class SignInWithTinkoffIdUseCase {
  final TinkoffIdFlutter _tinkoffId;

  SignInWithTinkoffIdUseCase(this._tinkoffId);

  Future<Result<List<String>>> getTokenFromTinkoffId() async {
    const redirectUri = "rdu://rduhost";
    const clientId = "tid_client_id";

    // 初始化客户端
    await _tinkoffId.init(clientId, redirectUri, false);

    // 检查 Tinkoff Bank 应用是否已安装
    final bool isAvailable = await _tinkoffId.isTinkoffAuthAvailable();
    if (!isAvailable) {
      return Result.failure("Tinkoff Bank 应用未找到或未安装。");
    }

    // 开始监听第一个链接
    final appLinkFuture = AppLinks().stringLinkStream.first;

    // 启动 Tinkoff Bank 应用
    await _tinkoffId.startTinkoffAuth(redirectUri);

    // 等待第一个传入链接
    late final String url;
    try {
      url = await appLinkFuture.timeout(Duration(seconds: 120));
    } catch (e) {
      return Result.failure("120 秒已过,但链接未到达。");
    }

    // 从传入链接中获取令牌
    late final TokenPayload payload;
    try {
      payload = await _tinkoffId.getTokenPayload(url);
    } on PlatformException catch (e, s) {
      return Result.failure("无法从 Tinkoff Bank 应用获取令牌:${e.message!}");
    }

    // 通过 refreshToken 更新令牌
    late final TokenPayload payloadNew;
    try {
      payloadNew = await _tinkoffId.updateToken(payload.refreshToken);
    } on PlatformException catch (e, s) {
      return Result.failure("无法将刷新令牌交换为访问令牌:${e.message!}");
    }

    // 通过 refreshToken 登出
    final bool success = await _tinkoffId.signOutByRefreshToken(payloadNew.refreshToken);
    if (!success) {
      return Result.failure("登出失败。");
    }

    // 返回成功结果
    return Result.success([
      payload.accessToken,
      payload.refreshToken,
      payloadNew.accessToken,
      payloadNew.refreshToken
    ]);
  }
}

// 示例 Result 类
class Result<T> {
  final T value;
  final String? error;

  Result.success(this.value) : error = null;

  Result.failure(this.error) : value = null;

  static Result<T> failure<T>(String message) => Result<T>.failure(message);

  static Result<T> success<T>(T value) => Result<T>.success(value);
}

更多关于Flutter身份验证插件tinkoff_id_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter身份验证插件tinkoff_id_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用tinkoff_id_flutter插件进行身份验证的示例代码。这个插件允许你集成Tinkoff ID进行用户身份验证。

首先,确保你已经在pubspec.yaml文件中添加了tinkoff_id_flutter依赖:

dependencies:
  flutter:
    sdk: flutter
  tinkoff_id_flutter: ^最新版本号 # 请替换为实际的最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter项目中,你可以按照以下步骤进行身份验证:

  1. 配置Tinkoff ID客户端

    在你的项目入口文件(通常是main.dart)或者一个专门负责身份验证的文件中,配置Tinkoff ID客户端。

import 'package:flutter/material.dart';
import 'package:tinkoff_id_flutter/tinkoff_id_flutter.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Tinkoff ID Authentication'),
        ),
        body: Center(
          child: AuthenticationPage(),
        ),
      ),
    );
  }
}

class AuthenticationPage extends StatefulWidget {
  @override
  _AuthenticationPageState createState() => _AuthenticationPageState();
}

class _AuthenticationPageState extends State<AuthenticationPage> {
  final TinkoffIdFlutter _tinkoffId = TinkoffIdFlutter();

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () async {
        try {
          // 配置Tinkoff ID参数
          final String clientId = 'your_client_id'; // 替换为你的Tinkoff ID客户端ID
          final String redirectUri = 'your_redirect_uri'; // 替换为你的重定向URI
          final String scope = 'openid profile email'; // 根据需要设置scope

          // 启动Tinkoff ID认证流程
          final result = await _tinkoffId.authorize(
            clientId: clientId,
            redirectUri: redirectUri,
            scope: scope,
          );

          // 处理认证结果
          if (result != null) {
            // 用户成功认证,result包含用户的身份信息
            print('Authorization successful: $result');
          } else {
            // 用户取消认证或发生错误
            print('Authorization failed or canceled');
          }
        } catch (e) {
          // 处理异常
          print('Error: $e');
        }
      },
      child: Text('Authenticate with Tinkoff ID'),
    );
  }
}
  1. 处理重定向URI

    在你的应用程序中,你需要设置一个网页视图或某种方式来处理Tinkoff ID认证后的重定向。这通常涉及在Android和iOS平台上配置一个自定义的URL scheme。

    对于Android

    android/app/src/main/AndroidManifest.xml中添加一个intent-filter来处理重定向URI:

<activity
    android:name=".MainActivity"
    android:label="your_label"
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
    android:hardwareAccelerated="true"
    android:windowSoftInputMode="adjustResize">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <!-- 添加以下intent-filter -->
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="your_scheme" android:host="your_host" />
    </intent-filter>
</activity>

对于iOS

ios/Runner/Info.plist中添加一个URL type来处理重定向URI:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>your_scheme</string>
        </array>
    </dict>
</array>
  1. 在Flutter中处理重定向回调

    你可能需要在你的应用程序中设置一个机制来处理从Tinkoff ID重定向回来的URL。这通常涉及到使用url_launcher包来监听和处理这些URL。不过,tinkoff_id_flutter插件可能已经处理了大部分细节,你只需要确保你的应用能够正确响应重定向URI。

请注意,上述代码是一个简化的示例,用于展示如何使用tinkoff_id_flutter插件进行身份验证。在实际应用中,你可能需要处理更多的边缘情况和错误处理逻辑。务必参考tinkoff_id_flutter的官方文档和示例代码,以确保你正确集成了该插件。

回到顶部