Dart HttpClientCredentials
最后修改于 2025 年 4 月 4 日
Dart 中的 HttpClientCredentials
类为 HTTP 请求提供了身份验证凭据。它与 HttpClient 一起用于安全通信。
HttpClientCredentials 处理基本身份验证、摘要身份验证和其他凭据类型。它是 Dart 的 dart:io
库的一部分。
基本定义
HttpClientCredentials
是一个表示 HTTP 身份验证凭据的抽象类。具体实现包括 Basic 和 Digest 凭据。
主要功能包括用户名/密码存储和身份验证方案支持。它通过 HttpClient 的身份验证 API 实现安全请求。
基本身份验证
此示例展示了使用 HttpClientCredentials 的基本 HTTP 身份验证。
import 'dart:io'; void main() async { var client = HttpClient(); // Set up credentials var credentials = HttpClientBasicCredentials('user', 'pass123'); // Add credentials for specific realm client.addCredentials( Uri.parse('https://example.com/secure'), 'realm1', credentials ); try { var request = await client.getUrl(Uri.parse('https://example.com/secure')); var response = await request.close(); print('Response status: ${response.statusCode}'); } finally { client.close(); } }
我们创建基本凭据,并将它们与特定的 URL 和域关联。当服务器提出挑战时,HttpClient 将使用这些凭据。
$ dart main.dart Response status: 200
摘要身份验证
此示例演示了使用 HttpClientCredentials 进行摘要身份验证。
import 'dart:io'; void main() async { var client = HttpClient(); // Set up digest credentials var credentials = HttpClientDigestCredentials('admin', 's3cr3t'); client.addCredentials( Uri.parse('https://api.example.com/admin'), 'admin-realm', credentials ); try { var request = await client.getUrl( Uri.parse('https://api.example.com/admin/data') ); var response = await request.close(); print('Admin access granted: ${response.statusCode}'); } finally { client.close(); } }
摘要身份验证比基本身份验证更安全。凭据在传输前会被哈希处理。服务器必须支持摘要身份验证。
$ dart main.dart Admin access granted: 200
多个凭据
此示例展示了为不同域使用不同凭据。
import 'dart:io'; void main() async { var client = HttpClient(); // User credentials for user area client.addCredentials( Uri.parse('https://example.com/user'), 'user-realm', HttpClientBasicCredentials('john', 'doe123') ); // Admin credentials for admin area client.addCredentials( Uri.parse('https://example.com/admin'), 'admin-realm', HttpClientBasicCredentials('admin', 'master') ); try { // Access user area var userRequest = await client.getUrl( Uri.parse('https://example.com/user/profile') ); var userResponse = await userRequest.close(); print('User status: ${userResponse.statusCode}'); // Access admin area var adminRequest = await client.getUrl( Uri.parse('https://example.com/admin/dashboard') ); var adminResponse = await adminRequest.close(); print('Admin status: ${adminResponse.statusCode}'); } finally { client.close(); } }
我们为网站的不同部分注册不同的凭据。HttpClient 会根据身份验证挑战自动选择相应的凭据。
$ dart main.dart User status: 200 Admin status: 200
处理身份验证错误
此示例演示了身份验证失败的错误处理。
import 'dart:io'; void main() async { var client = HttpClient(); client.addCredentials( Uri.parse('https://example.com/secure'), 'test-realm', HttpClientBasicCredentials('wrong', 'credentials') ); try { var request = await client.getUrl( Uri.parse('https://example.com/secure/data') ); var response = await request.close(); if (response.statusCode == HttpStatus.unauthorized) { print('Authentication failed'); } else { print('Success: ${response.statusCode}'); } } on SocketException catch (e) { print('Network error: $e'); } finally { client.close(); } }
身份验证失败时,服务器会返回 401 Unauthorized。我们检查状态码以优雅地处理身份验证失败。
$ dart main.dart Authentication failed
自定义身份验证方案
此示例展示了如何实现自定义身份验证凭据。
import 'dart:io'; class ApiKeyCredentials implements HttpClientCredentials { final String apiKey; ApiKeyCredentials(this.apiKey); @override String toString() => 'API Key: $apiKey'; } void main() async { var client = HttpClient(); // Register custom credentials client.addCredentials( Uri.parse('https://api.example.com/v1'), 'api-realm', ApiKeyCredentials('xyz123abc456') ); // Handle authentication challenges client.authenticate = (url, scheme, realm) { print('Authenticating to $realm with $scheme'); return true; // Attempt authentication }; try { var request = await client.getUrl( Uri.parse('https://api.example.com/v1/data') ); var response = await request.close(); print('API response: ${response.statusCode}'); } finally { client.close(); } }
我们创建了一个自定义凭据类用于 API 密钥身份验证。authenticate 回调允许自定义逻辑来处理身份验证挑战。
$ dart main.dart Authenticating to api-realm with API response: 200
最佳实践
- 安全存储:切勿在源代码中硬编码凭据
- 仅限 HTTPS:始终将凭据与 HTTPS 一起使用
- 域匹配:确保域与服务器的预期匹配
- 错误处理:优雅地处理身份验证失败
- 凭据轮换:为提高安全性实施凭据轮换
来源
本教程介绍了 Dart 的 HttpClientCredentials 类,并通过实际示例展示了基本和摘要身份验证、错误处理以及自定义方案。
作者
列出 所有 Dart 教程。