Flutter身份认证与授权插件cidaas_flutter_sdk的使用

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

Flutter身份认证与授权插件cidaas_flutter_sdk的使用

概述

cidaas_flutter_sdk 是一个用于在Flutter应用中实现安全身份验证和授权的插件。它简化了与Cidaas服务集成的过程,支持OAuth 2.0和OpenID Connect协议。

开始之前

要求

确保你的Dart SDK版本满足以下要求:

SDK: ">=2.7.0 <3.0.0"

安装

在项目的 pubspec.yaml 文件中添加 cidaas-SDK-flutter 依赖:

dependencies:
  cidaas-SDK-flutter: ^3.3.3

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

配置

首先,在项目根目录下创建一个名为 cidaas_config.json 的配置文件,并填充如下内容:

{
  "baseUrl": "https://yourCidaasBaseUrl.de",
  "clientId": "your_apps_clientId",
  "clientSecret": "your_apps_clientSecret",
  "scopes": "openid profile email offline_access",
  "redirectUri": "https://your_apps_redirectUri.de"
}

别忘了在 pubspec.yaml 中添加 /assets/ 文件夹作为资源:

flutter:
  assets:
    - assets/

默认情况下,SDK会在 /assets 目录下查找配置文件。如果你希望自定义路径,请调用 checkAndLoadConfig({configPath: "your/custom/path/to/your/cidaas_config.json"}) 方法,并确保在首次登录事件触发前完成此操作。

使用指南

集成SDK

要将SDK集成到你的应用程序中,你需要实现 Cidaas 类。这个类封装了由身份验证Bloc使用的状态逻辑。

下面是一个简单的示例,展示了如何实现这些方法:

import 'package:flutter/material.dart';
import 'package:cidaas-SDK-flutter/cidaas-SDK-flutter.dart';

class MyCidaasImpl extends Cidaas {
  
  @override
  Widget getLoggedOutScreen({context}) {
    return Center(
      child: ElevatedButton(
        child: Text('Login'),
        onPressed: () {
          CidaasLoginProvider.doLogin(context);
        },
      ),
    );
  }
  
  @override
  Widget getLoggedInScreen({tokenEntity}) {
    return MyCustomLoggedInScreen(tokenEntity: tokenEntity);
  }

  @override
  Widget getSplashScreen() {
    return Center(
      child: Text('Please wait'),
    );
  }

  @override
  Widget getAuthenticationFailureScreen({errorMessage}) {
    return Scaffold(
      body: Center(
        child: Text('$errorMessage', style: TextStyle(fontWeight: FontWeight.bold, color: Colors.red)),
      ),
    );
  }
}

// 在主函数中初始化并使用
void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BlocProvider<AuthenticationBloc>(
      create: (context) => AuthenticationBloc(),
      child: MaterialApp(
        home: Scaffold(
          appBar: AppBar(title: Text('App')),
          body: MyCidaasImpl(),
        ),
      ),
    );
  }
}

获取访问令牌

用户登录后,你可以通过以下方式获取访问令牌:

TokenEntity tokenEntity = await CidaasLoginProvider.getStoredAccessToken();

返回的 TokenEntity 包含 accessToken, idToken, sub, 和 refreshToken

检查用户是否已登录

你可以通过以下代码手动检查用户是否已登录:

bool isLoggedIn = await CidaasLoginProvider.isAuth();

触发登录和登出

你可以随时从代码中触发登录或登出:

CidaasLoginProvider.doLogin(context); // 触发登录
CidaasLoginProvider.doLogout(context); // 触发登出

请注意,提供的上下文必须包含 AuthenticationBloc

以上是关于如何在Flutter应用中使用 cidaas_flutter_sdk 插件进行身份验证和授权的基本介绍和示例。更多详细信息请参考 Cidaas官方文档


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

1 回复

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


当然,以下是如何在Flutter项目中集成并使用cidaas_flutter_sdk进行身份认证与授权的示例代码。这包括基本的用户注册、登录和获取用户信息的流程。

1. 添加依赖

首先,在你的Flutter项目的pubspec.yaml文件中添加cidaas_flutter_sdk依赖:

dependencies:
  flutter:
    sdk: flutter
  cidaas_flutter_sdk: ^最新版本号  # 请替换为最新版本号

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

2. 配置cidaas

在cidaas平台注册你的应用并获取所需的配置信息,如clientIdclientSecretdomain等。

3. 初始化cidaas_flutter_sdk

在你的Flutter项目的入口文件(通常是main.dart)中初始化cidaas_flutter_sdk:

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

void main() {
  // 初始化cidaas SDK
  CidaasFlutterSdk.init(
    clientId: '你的ClientId',
    clientSecret: '你的ClientSecret',
    domain: '你的Domain',
    // 其他可选配置
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

4. 用户注册

创建一个注册页面,允许用户输入注册信息并提交:

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

class RegisterScreen extends StatefulWidget {
  @override
  _RegisterScreenState createState() => _RegisterScreenState();
}

class _RegisterScreenState extends State<RegisterScreen> {
  final _formKey = GlobalKey<FormState>();
  String email = '';
  String password = '';

  void _submit() async {
    if (_formKey.currentState!.validate()) {
      _formKey.currentState!.save();

      try {
        var result = await CidaasFlutterSdk.register(
          email: email,
          password: password,
        );
        print('注册结果: ${result.toString()}');
        // 处理注册结果,例如跳转到登录页面
      } catch (e) {
        print('注册失败: ${e.toString()}');
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('注册'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            children: <Widget>[
              TextFormField(
                decoration: InputDecoration(labelText: 'Email'),
                validator: (value) {
                  if (value == null || value.isEmpty) {
                    return '请输入Email';
                  }
                  return null;
                },
                onSaved: (value) {
                  email = value!;
                },
              ),
              TextFormField(
                decoration: InputDecoration(labelText: 'Password'),
                validator: (value) {
                  if (value == null || value.isEmpty) {
                    return '请输入密码';
                  }
                  return null;
                },
                obscureText: true,
                onSaved: (value) {
                  password = value!;
                },
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: _submit,
                child: Text('注册'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

5. 用户登录

创建一个登录页面,允许用户输入登录信息并提交:

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

class LoginScreen extends StatefulWidget {
  @override
  _LoginScreenState createState() => _LoginScreenState();
}

class _LoginScreenState extends State<LoginScreen> {
  final _formKey = GlobalKey<FormState>();
  String email = '';
  String password = '';

  void _submit() async {
    if (_formKey.currentState!.validate()) {
      _formKey.currentState!.save();

      try {
        var result = await CidaasFlutterSdk.login(
          email: email,
          password: password,
        );
        print('登录结果: ${result.toString()}');
        // 处理登录结果,例如保存token或跳转到主页面
      } catch (e) {
        print('登录失败: ${e.toString()}');
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('登录'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            children: <Widget>[
              TextFormField(
                decoration: InputDecoration(labelText: 'Email'),
                validator: (value) {
                  if (value == null || value.isEmpty) {
                    return '请输入Email';
                  }
                  return null;
                },
                onSaved: (value) {
                  email = value!;
                },
              ),
              TextFormField(
                decoration: InputDecoration(labelText: 'Password'),
                validator: (value) {
                  if (value == null || value.isEmpty) {
                    return '请输入密码';
                  }
                  return null;
                },
                obscureText: true,
                onSaved: (value) {
                  password = value!;
                },
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: _submit,
                child: Text('登录'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

6. 获取用户信息

一旦用户成功登录,你可以使用cidaas SDK提供的API来获取用户信息:

void _fetchUserInfo() async {
  try {
    var userInfo = await CidaasFlutterSdk.getUserInfo();
    print('用户信息: ${userInfo.toString()}');
    // 处理用户信息,例如显示在UI上
  } catch (e) {
    print('获取用户信息失败: ${e.toString()}');
  }
}

7. 完整示例

将上述代码片段组合成一个完整的Flutter应用:

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

void main() {
  CidaasFlutterSdk.init(
    clientId: '你的ClientId',
    clientSecret: '你的ClientSecret',
    domain: '你的Domain',
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('cidaas Flutter SDK 示例'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () => Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => RegisterScreen()),
              ),
              child: Text('注册'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () => Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => LoginScreen()),
              ),
              child: Text('登录'),
            ),
          ],
        ),
      ),
    );
  }
}

// RegisterScreen 和 LoginScreen 类代码如上所示

这个示例展示了如何使用cidaas_flutter_sdk进行用户注册、登录和获取用户信息的基本流程。你可以根据需要进一步扩展和自定义这些功能。

回到顶部