Flutter安全认证插件castle_flutter的使用

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

Flutter安全认证插件castle_flutter的使用

Castle for Flutter

Castle 为您的身份验证堆栈添加了实时监控功能,可以即时通知您和您的用户潜在的账户劫持事件。

使用

要使用此插件,在您的 pubspec.yaml 文件中添加 castle_flutter 作为依赖项。

要求

Flutter

  • Flutter 1.20.0+

iOS

  • iOS 9.0+
  • Xcode 9.0+

Android

  • Android 5.0

使用

请参阅 Mobile Integration Guide

许可证

MIT


示例代码

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

import 'package:flutter/services.dart';
import 'package:castle_flutter/castle.dart';

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

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _token = '';
  int _queueSize = 0;
  String _userAgent = '';
  String _requestTokenHeaderName = '';

  [@override](/user/override)
  void initState() {
    super.initState();
    initCastle();
  }

  // 平台消息是异步的,所以我们初始化时使用异步方法。
  Future<void> initCastle() async {
    var token, userId, baseUrl, queueSize, userAgent, clientIdHeaderName, requestTokenHeaderName;
    try {
      await Castle.configure(
        publishableKey: "pk_CTsfAeRTqxGgA7HHxqpEESvjfPp4QAKA",
        debugLoggingEnabled: true,
        maxQueueLimit: 100,
        flushLimit: 20,
        baseURLAllowList: ["http://google.com"],
      );
      // 设置模拟IDFA
      await Castle.advertisingIdentifier("00000000-0000-0000-0000-000000000001");
      token = await Castle.createRequestToken;
      queueSize = await Castle.queueSize;
      userAgent = await Castle.userAgent;
      requestTokenHeaderName = await Castle.requestTokenHeaderName;
      await Castle.userJwt(
          "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImVjMjQ0ZjMwLTM0MzItNGJiYy04OGYxLTFlM2ZjMDFiYzFmZSIsImVtYWlsIjoidGVzdEBleGFtcGxlLmNvbSIsInJlZ2lzdGVyZWRfYXQiOiIyMDIyLTAxLTAxVDA5OjA2OjE0LjgwM1oifQ.eAwehcXZDBBrJClaE0bkO9XAr4U3vqKUpyZ-d3SxnH0"
      );
    } on PlatformException {

    }

    // 如果在异步平台消息飞行期间小部件从树中移除,我们希望丢弃回复而不是调用
    // setState 更新我们的非存在的外观。
    if (!mounted) return;

    setState(() {
      _token = token.toString();
      _queueSize = queueSize;
      _userAgent = userAgent.toString();
      _requestTokenHeaderName = requestTokenHeaderName.toString();
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Castle TestApp'),
        ),
        body: Container(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.stretch,
            mainAxisSize: MainAxisSize.min,
            children: [
              Text(_token),
              Text(_queueSize.toString()),
              Text(_userAgent),
              Text(_requestTokenHeaderName),
              ElevatedButton(
                onPressed: _userJwt,
                child: Text("Set user jwt"),
              ),
              ElevatedButton(
                onPressed: _trackScreen,
                child: Text("Track Screen"),
              ),
              ElevatedButton(
                onPressed: _trackCustom,
                child: Text("Track custom"),
              ),
              ElevatedButton(
                onPressed: _trackCustomProperties,
                child: Text("Track custom with properties"),
              ),
              ElevatedButton(
                onPressed: _reset,
                child: Text("Reset"),
              ),
              ElevatedButton(
                onPressed: _flush,
                child: Text("Flush Events"),
              ),
            ],
          ),
        ),
      ),
    );
  }

  void _userJwt() {
    Castle.userJwt(
      "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImVjMjQ0ZjMwLTM0MzItNGJiYy04OGYxLTFlM2ZjMDFiYzFmZSIsImVtYWlsIjoidGVzdEBleGFtcGxlLmNvbSIsInJlZ2lzdGVyZWRfYXQiOiIyMDIyLTAxLTAxVDA5OjA2OjE0LjgwM1oifQ.eAwehcXZDBBrJClaE0bkO9XAr4U3vqKUpyZ-d3SxnH0"
    );
  }

  void _trackScreen() {
    Castle.screen("Example screen");
  }

  void _trackCustom() {
    Castle.custom("Custom event", null);
  }

  void _trackCustomProperties() {
    Castle.custom("Custom event with properties", {
      "product": "iPhone 13 Pro",
      "price": 1099.99
    });
  }

  void _reset() {
    Castle.reset();
  }

  void _flush() {
    Castle.flush();
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用castle_flutter插件来进行安全认证的示例代码。castle_flutter是一个Flutter插件,用于集成Castle.io的安全认证服务。Castle.io提供了一系列功能,比如设备指纹、风险评分和行为分析等,以增强应用的安全性。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加castle_flutter依赖:

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

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

2. 配置Castle SDK

你需要在Castle.io的仪表盘上获取你的public_api_keysecret_api_key,并在你的应用中配置它们。通常,public_api_key是公开的,而secret_api_key应该保密。

3. 初始化Castle

在你的应用入口文件(通常是main.dart)中初始化Castle:

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

void main() {
  // 初始化Castle
  CastleFlutter.initialize(
    publicKey: '你的public_api_key', // 从Castle.io获取的公钥
    environment: 'production' // 或者 'development',根据你的环境选择
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Castle Flutter Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _handleLogin,
          child: Text('Login'),
        ),
      ),
    );
  }

  void _handleLogin() async {
    // 假设你有一个用户对象
    Map<String, dynamic> user = {
      'email': 'user@example.com',
      'password': 'password123',
    };

    // 你可以在这里调用Castle的API来进行风险评分等
    try {
      // 假设你有一个API调用来验证用户凭证
      bool isValidUser = await validateUserCredentials(user['email'], user['password']);

      if (isValidUser) {
        // 用户凭证验证成功,调用Castle的trackUser方法
        await CastleFlutter.trackUser(
          userId: user['email'], // 用户唯一标识符
          traits: {
            'email': user['email'],
          },
        );

        // 可以根据Castle的风险评分决定是否允许登录
        final riskScore = await CastleFlutter.getRiskScore();
        if (riskScore?.score <= 50) { // 假设50是一个安全阈值
          // 登录成功
          print('Login successful');
        } else {
          // 风险太高,拒绝登录
          print('Login denied due to high risk score');
        }
      } else {
        // 用户凭证验证失败
        print('Invalid credentials');
      }
    } catch (e) {
      print('Error: ${e.message}');
    }
  }

  // 这是一个模拟的用户凭证验证函数,你需要替换为你的实际API调用
  Future<bool> validateUserCredentials(String email, String password) async {
    // 模拟API调用,总是返回true
    return Future.value(true);
  }
}

注意事项

  1. 敏感信息处理:不要在客户端代码中硬编码任何敏感信息,如secret_api_key。这些信息应该保存在服务器端,并通过安全的方式与客户端交互。
  2. API调用:上面的代码示例中,validateUserCredentials函数是一个模拟的API调用。你需要替换为实际的API调用来验证用户凭证。
  3. 风险评分阈值:在示例代码中,风险评分阈值被硬编码为50。这个值应该根据你的实际业务需求进行调整。

通过上述步骤,你应该能够在Flutter应用中使用castle_flutter插件来增强应用的安全性。

回到顶部