Flutter OpenID Connect核心功能插件oidc_core的使用

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

Flutter OpenID Connect核心功能插件oidc_core的使用

oidc_core

style: very_good_analysis License: MIT codecov Pub Version

一个用于dart的 OpenId Connect RP (Relying Party) 包,它暴露了由OIDC标准定义的基本模型和功能。

请务必阅读 Wiki 以了解如何使用此包。


简介

该包仅需要dart,可以在所有平台上使用。

由于 OIDC 规范要求与底层平台进行交互(例如,启动浏览器,监听重定向等),此包不能单独实现规范。

完整的规范在 package:oidc 中实现,该包依赖于flutter。


安装 💻

为了开始使用此包,您必须在计算机上安装 Dart SDK

在您的 pubspec.yaml 文件中添加:

dart pub add oidc_core

运行测试 🧪

要运行所有单元测试:

dart pub global activate coverage 1.2.0
dart test --coverage=coverage
dart pub global run coverage:format_coverage --lcov --in=coverage --out=coverage/lcov.info

要查看生成的覆盖率报告,您可以使用 lcov

# 生成覆盖率报告
genhtml coverage/lcov.info -o coverage/

# 打开覆盖率报告
open coverage/index.html

使用示例

以下示例展示了如何在命令行界面中使用授权码流。这个例子使用了 https://demo.duendesoftware.com 的身份提供商 (idp),可以使用Google登录,或者使用用户名 “bob/bob” 或 “alice/alice” 登录。

示例代码

// ignore_for_file: avoid_print, omit_local_variable_types

import 'package:oidc_core/oidc_core.dart';

// 检查此文件以了解用户管理器的实现
import 'cli_user_manager.dart';

// 此示例展示了如何使用授权码流通过命令行界面
// 从 https://demo.duendesoftware.com 身份提供商登录。
// 您可以使用 Google 登录,或使用 "bob/bob" 或 "alice/alice" 登录。

final idp = Uri.parse('https://demo.duendesoftware.com/');
const String clientId = 'interactive.public';
final store = OidcMemoryStore();

void main() async {
  // 初始化用户管理器
  final manager = CliUserManager.lazy(
    discoveryDocumentUri: OidcUtils.getOpenIdConfigWellKnownUri(idp),
    clientCredentials: const OidcClientAuthentication.none(
      clientId: clientId,
    ),
    store: store,
    settings: OidcUserManagerSettings(
      // 获取任何可用端口
      redirectUri: Uri.parse('http://127.0.0.1:0'),
      postLogoutRedirectUri: Uri.parse('http://127.0.0.1:0'),
    ),
  );

  print('初始化命令行用户管理器...');
  await manager.init();
  print('用户管理器已初始化!');

  // 获取当前用户或登录
  final OidcUser? user =
      manager.currentUser ?? await manager.loginAuthorizationCodeFlow();
  
  if (user == null) {
    print('未能获取用户。');
  } else {
    print('用户验证成功!');
    print('主题: ${user.claims.subject}');
    print('声明: ${user.aggregatedClaims}');
    print('用户信息: ${user.userInfo}');

    print('再次注销用户:');

    await manager.logout();

    print('用户已注销。');
  }
}

更多关于Flutter OpenID Connect核心功能插件oidc_core的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter OpenID Connect核心功能插件oidc_core的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用oidc_core插件来实现OpenID Connect核心功能的示例代码。oidc_core插件主要用于处理OpenID Connect认证流程,包括发现OpenID提供者、执行认证请求和处理认证响应。

首先,确保你的Flutter项目已经添加了oidc_core依赖。在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  oidc_core: ^最新版本号  # 替换为实际可用的最新版本号

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

接下来,我们编写一个示例,展示如何使用oidc_core插件进行OpenID Connect认证。

示例代码

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final OidcClient _oidcClient = OidcClient(
    issuerUrl: 'https://your-openid-provider.com', // 替换为你的OpenID提供者URL
    clientId: 'your-client-id', // 替换为你的客户端ID
    redirectUri: 'your-redirect-uri://callback', // 替换为你的重定向URI
    scopes: ['openid', 'profile', 'email'], // 请求的scope
  );

  String _authenticationResult = '';

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter OpenID Connect Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Authentication Result:',
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 20),
              Text(
                _authenticationResult,
                style: TextStyle(fontSize: 18),
              ),
              SizedBox(height: 40),
              ElevatedButton(
                onPressed: () async {
                  try {
                    // 启动认证流程
                    Uri authorizationUri = await _oidcClient.createAuthorizationUri();
                    // 这里你需要一个方式来启动浏览器并打开这个URI,比如使用url_launcher插件
                    // 示例(需要添加url_launcher依赖并处理回调):
                    // await launch(authorizationUri.toString());
                    // 注意:实际使用中,你需要处理重定向回调,这里只是演示创建URI

                    // 假设你已经处理了回调,并且得到了code或token
                    // 这里我们模拟一个code
                    String code = 'your-authorization-code'; // 替换为实际的code

                    // 使用code获取tokens
                    OidcTokenResponse tokenResponse =
                        await _oidcClient.exchangeCodeForTokens(code);

                    // 更新状态以显示结果
                    setState(() {
                      _authenticationResult = 'Access Token: ${tokenResponse.accessToken}\n'
                          'ID Token: ${tokenResponse.idToken}\n'
                          'Refresh Token: ${tokenResponse.refreshToken ?? "N/A"}';
                    });
                  } catch (e) {
                    setState(() {
                      _authenticationResult = 'Error: $e';
                    });
                  }
                },
                child: Text('Authenticate'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意事项

  1. 处理重定向回调: 上面的示例代码中注释掉了实际启动浏览器并打开授权URI的部分。在实际应用中,你需要使用如url_launcher插件来启动浏览器,并处理重定向回调。这通常涉及到在Android和iOS平台上配置自定义URL scheme。

  2. 安全性: 确保你的重定向URI是安全的,并且只在你的应用中处理。不要将敏感信息(如授权码)暴露在客户端日志或UI中。

  3. 错误处理: 示例代码中简单捕获了异常并更新了UI。在实际应用中,你可能需要更详细的错误处理和用户反馈机制。

  4. 依赖管理: 确保oidc_core插件的版本与你的Flutter SDK版本兼容。

通过上述代码,你可以在Flutter应用中实现OpenID Connect认证的基本流程。根据实际需求,你可能需要进一步定制和扩展这些功能。

回到顶部