Flutter OpenID客户端认证插件openid_client_leftofhere的使用
Flutter OpenID客户端认证插件openid_client_leftofhere
的使用
OpenID客户端
该库用于处理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
更多关于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
来安装插件。
使用步骤
-
导入包
在你的 Dart 文件中导入
openid_client_leftofhere
包:import 'package:openid_client_leftofhere/openid_client_leftofhere.dart';
-
配置 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');
-
创建认证流程
使用
Flow
类来创建认证流程。你可以选择使用授权码流程(AuthorizationCodeFlow
)或隐式流程(ImplicitFlow
)。final flow = AuthorizationCodeFlow( client: client, redirectUri: Uri.parse('com.example.app://callback'), );
-
启动认证
使用
flow
启动认证流程,并获取授权码。final authUri = flow.getAuthorizationUrl(); // 打开浏览器或其他方式让用户访问 authUri 进行认证
-
处理回调
在用户完成认证后,OpenID Connect 提供者会重定向到你的应用,并附带授权码。你需要处理这个回调并获取访问令牌。
final response = await flow.handleAuthorizationResponse(responseUri); final tokenResponse = await flow.getTokenResponse(response);
-
使用访问令牌
现在你可以使用
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'),
],
),
),
);
}
}