Flutter身份验证插件tinkoff_id_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
更多关于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项目中,你可以按照以下步骤进行身份验证:
-
配置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'),
);
}
}
-
处理重定向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>
-
在Flutter中处理重定向回调:
你可能需要在你的应用程序中设置一个机制来处理从Tinkoff ID重定向回来的URL。这通常涉及到使用
url_launcher
包来监听和处理这些URL。不过,tinkoff_id_flutter
插件可能已经处理了大部分细节,你只需要确保你的应用能够正确响应重定向URI。
请注意,上述代码是一个简化的示例,用于展示如何使用tinkoff_id_flutter
插件进行身份验证。在实际应用中,你可能需要处理更多的边缘情况和错误处理逻辑。务必参考tinkoff_id_flutter
的官方文档和示例代码,以确保你正确集成了该插件。