Flutter OpenID客户端认证插件openid_client_leftofhere的使用

Flutter OpenID客户端认证插件openid_client_leftofhere的使用

OpenID客户端

Build Status

该库用于处理OpenID Connect并实现客户端。它目前支持以下功能:

  • 发现OpenID提供者元数据
  • 解析和验证ID令牌
  • 基本工具实现隐式和授权码流程
  • 命令行工具的认证

除了支持OpenID Connect的认证提供者外,该库还可以与支持OAuth2的其他认证提供者一起工作,例如Facebook。对于这些提供者,某些功能(如发现和ID令牌)将无法使用。你应该手动定义这些提供者的元数据,除了Facebook,它在库中预先定义。

使用方法

以下是使用库的一些示例。更多示例可以在example文件夹中找到。它包含如何在flutter、命令行和浏览器应用程序中使用该库的完整示例。

简单用法示例

import 'package:openid_client/openid_client.dart';

main() async {

  // 打印已知的发行人列表
  print(Issuer.knownIssuers);

  // 发现google OP的元数据
  var issuer = await Issuer.discover(Issuer.google);
  
  // 创建一个客户端
  var client = new Client(issuer, "client_id", "client_secret");
  
  // 从授权码创建凭证对象
  var c = client.createCredential(code: "some received authorization code");

  // 或者从访问令牌创建
  c = client.createCredential(accessToken: "some received access token");

  // 或者从ID令牌创建
  c = client.createCredential(idToken: "some id token");      

  // 获取用户信息
  var info = await c.getUserInfo();
  print(info.name);
  
  // 如果存在,获取ID令牌中的声明
  print(c.idToken?.claims?.name);
  
  // 创建隐式认证流
  var f = new Flow.implicit(client);
  
  // 或者创建显式流
  f = new Flow.authorizationCode(client);
  
  // 设置重定向URI
  f.redirectUri = Uri.parse("http://localhost");
  
  // 处理认证URL
  print(f.authenticationUrl);
  
  // 处理结果并获取凭证对象
  c = await f.callback({
    "code": "some code",
  });
  
  // 验证ID令牌
  var violations = await c.validateToken();
}

Flutter上的用法示例

// 导入io版本
import 'package:openid_client/openid_client_io.dart';
// 使用url_launcher包
import 'package:url_launcher/url_launcher.dart';

authenticate(Uri uri, String clientId, List<String> scopes) async {   
    
    // 创建客户端
    var issuer = await Issuer.discover(uri);
    var client = new Client(issuer, clientId);
    
    // 创建一个打开带有URL的浏览器的函数
    urlLauncher(String url) async {
        if (await canLaunch(url)) {
          await launch(url, forceWebView: true);
        } else {
          throw 'Could not launch $url';
        }
    }
    
    // 创建认证器
    var authenticator = new Authenticator(client,
        scopes: scopes,
        port: 4000, urlLancher: urlLauncher);
    
    // 开始认证
    var c = await authenticator.authorize();
    
    // 完成后关闭webview
    closeWebView();
    
    // 返回用户信息
    return await c.getUserInfo();
}

命令行上的用法示例

// 导入io版本
import 'package:openid_client/openid_client_io.dart';

authenticate(Uri uri, String clientId, List<String> scopes) async {   
    
    // 创建客户端
    var issuer = await Issuer.discover(uri);
    var client = new Client(issuer, clientId);
    
    // 创建认证器
    var authenticator = new Authenticator(client,
        scopes: scopes,
        port: 4000);
    
    // 开始认证
    var c = await authenticator.authorize(); // 这将打开浏览器
    
    // 返回用户信息
    return await c.getUserInfo();
}

浏览器上的用法示例

// 导入浏览器版本
import 'package:openid_client/openid_client_browser.dart';

authenticate(Uri uri, String clientId, List<String> scopes) async {   
    
    // 创建客户端
    var issuer = await Issuer.discover(uri);
    var client = new Client(issuer, clientId);
    
    // 创建认证器
    var authenticator = new Authenticator(client, scopes: scopes);
    
    // 获取凭证
    var c = await authenticator.credential;
    
    if (c==null) {
      // 开始认证
      authenticator.authorize(); // 这将重定向浏览器
    } else {
      // 返回用户信息
      return await c.getUserInfo();
    }
}

命令行工具

安装

pub global activate openid_client

使用

显示已知的OpenID提供者列表:

openid_client issuers list

发现并显示OP的元数据:

openid_client issuers discover https://www.example.com

显示已知的客户端列表:

openid_client clients list

添加一个客户端:

openid_client clients configure --secret optional_secret https://some.issuer.com client_id

删除一个客户端:

openid_client clients remove https://some.issuer.com client_id

使用客户端进行认证:

openid_client clients auth --secret optional_secret https://some.issuer.com client_id

显示ID令牌的内容并验证它:

openid_client tokens validate eyJhbGciOiJSUzI1NiIsImtpZCI6ImE2YzJjNmQ0ZTZkYTFmOWJjMTdmYzhkMzExMzNiOTJmMDdlOTgxMTkifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJpYXQiOjE0ODU4ODQyNzcsImV4cCI6MTQ4NTg4Nzg3NywiYXRfaGFzaCI6Ik9nWUlZRzM1WXB6RmVvRlZBeWd1VUEiLCJhdWQiOiI1ODExNTUxMDQ5NDMtcnBqazBzanZucDFrZ2FkYzV0Mm5pOXFvYWt0ZGpzMjEuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzdWIiOiIxMTI2NzgyNTk2NzYyMTE3MDcxNDgiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXpwIjoiNTgxMTU1MTA0OTQzLXJwamswc2p2bnAxa2dhZGM1dDJuaTlxb2FrdGRqczIxLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiZW1haWwiOiJyaWsuYmVsbGVuc0BnbWFpbC5jb20iLCJuYW1lIjoiUmlrIEJlbGxlbnMiLCJwaWN0dXJlIjoiaHR0cHM6Ly9saDUuZ29vZ2xldXNlcmNvbnRlbnQuY29tLy1lRmpwUXFfUTZWUS9BQUFBQUFBQUFBSS9BQUFBQUFBQUFCUS9md1U0alVicTJ5US9zOTYtYy9waG90by5qcGciLCJnaXZlbl9uYW1lIjoiUmlrIiwiZmFtaWx5X25hbWUiOiJCZWxsZW5zIiwibG9jYWxlIjoibmwifQ.TlXzuNLdd5hX-bzMrwBaclcE8z4So2wFJAZ_H7hGz8YA4lCxHV8iON8yuJ1PdXGuOOkDXScj4qSPK80IZ_J29Uf2azCH83djpjyP4McB_dG4zXkUSFGFTHiNnqmvFbMmL-91A74teAr1ZHDx5-so2bHs16_c8immj2YM5GqlN4FG_IFCqRZ-7jEn9m_SjBXpb_NahiDB-bk47npmM9GIWq4OhV4e4tpFO1XY7H4fDHoiBhkc1nrbUjiqTH3VOJVQNp6FjiO2ErR7UWWnSKX6PMFDJ-U-QSsC8gu0PtuIa1ZUXvTAdX5vKt_fsKijbiT0xUUq8xJATaDh8-aBsNKpqQ

更多关于Flutter OpenID客户端认证插件openid_client_leftofhere的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


openid_client_leftofhere 是一个 Flutter 插件,用于在 Flutter 应用中实现 OpenID Connect (OIDC) 客户端认证。它基于 openid_client 包,并提供了对 Flutter 的更好支持。这个插件可以帮助你轻松地与 OpenID Connect 认证服务器进行交互,获取访问令牌、刷新令牌等信息。

安装

首先,你需要在 pubspec.yaml 文件中添加 openid_client_leftofhere 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  openid_client_leftofhere: ^0.1.0 # 请检查最新版本

然后,运行 flutter pub get 来安装插件。

使用步骤

  1. 导入包

    在你的 Dart 文件中导入 openid_client_leftofhere 包:

    import 'package:openid_client_leftofhere/openid_client_leftofhere.dart';
    
  2. 配置 OpenID Connect 客户端

    你需要提供 OpenID Connect 提供者的元数据、客户端 ID 和重定向 URI 来配置客户端。

    final issuer = await Issuer.discover(IssuerUri.parse('https://your-oidc-provider.com'));
    final client = Client(issuer, 'your-client-id');
    
  3. 创建认证流程

    使用 Flow 类来创建认证流程。你可以选择使用授权码流程(AuthorizationCodeFlow)或隐式流程(ImplicitFlow)。

    final flow = AuthorizationCodeFlow(
      client: client,
      redirectUri: Uri.parse('com.example.app://callback'),
    );
    
  4. 启动认证

    使用 flow 启动认证流程,并获取授权码。

    final authUri = flow.getAuthorizationUrl();
    // 打开浏览器或其他方式让用户访问 authUri 进行认证
    
  5. 处理回调

    在用户完成认证后,OpenID Connect 提供者会重定向到你的应用,并附带授权码。你需要处理这个回调并获取访问令牌。

    final response = await flow.handleAuthorizationResponse(responseUri);
    final tokenResponse = await flow.getTokenResponse(response);
    
  6. 使用访问令牌

    现在你可以使用 tokenResponse 中的访问令牌来访问受保护的资源。

    final httpClient = Client();
    httpClient.get(Uri.parse('https://your-api.com/resource'), headers: {
      'Authorization': 'Bearer ${tokenResponse.accessToken}',
    });
    

示例代码

以下是一个完整的示例代码,展示了如何使用 openid_client_leftofhere 进行 OpenID Connect 认证:

import 'package:flutter/material.dart';
import 'package:openid_client_leftofhere/openid_client_leftofhere.dart';
import 'package:http/http.dart' as http;

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: OpenIDConnectDemo(),
    );
  }
}

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

class _OpenIDConnectDemoState extends State<OpenIDConnectDemo> {
  String _token = '';

  Future<void> _authenticate() async {
    final issuer = await Issuer.discover(IssuerUri.parse('https://your-oidc-provider.com'));
    final client = Client(issuer, 'your-client-id');
    final flow = AuthorizationCodeFlow(
      client: client,
      redirectUri: Uri.parse('com.example.app://callback'),
    );

    final authUri = flow.getAuthorizationUrl();
    // 打开浏览器或其他方式让用户访问 authUri 进行认证

    // 假设用户已经完成认证,并重定向回应用
    final responseUri = Uri.parse('com.example.app://callback?code=authorization_code');
    final response = await flow.handleAuthorizationResponse(responseUri);
    final tokenResponse = await flow.getTokenResponse(response);

    setState(() {
      _token = tokenResponse.accessToken;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('OpenID Connect Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: _authenticate,
              child: Text('Authenticate'),
            ),
            SizedBox(height: 20),
            Text('Access Token: $_token'),
          ],
        ),
      ),
    );
  }
}
回到顶部