ZetCode

Dart HttpClientBasicCredentials

最后修改于 2025 年 4 月 4 日

Dart 中的 HttpClientBasicCredentials 类提供了一种处理 HTTP 基本身份验证的方法。它与 Dart 的 HttpClient 一起用于安全请求。

此类创建用于 Basic 身份验证方案的凭据。它将用户名和密码以 base64 格式编码到 HTTP Authorization 标头中。

基本定义

HttpClientBasicCredentials 是 Dart dart:io 库的一部分。它实现了 HTTP 基本身份验证的凭据。

此类接受用户名和密码参数。它会自动处理 Basic 身份验证方案所需的 base64 编码。

基本身份验证示例

此示例展示了 HttpClientBasicCredentials 的基本用法。

main.dart
import 'dart:io';

void main() async {
  var client = HttpClient();
  
  try {
    var request = await client.getUrl(Uri.parse('https://example.com/api'));
    
    var credentials = HttpClientBasicCredentials('user', 'pass123');
    request.headers.set('Authorization', credentials.toString());
    
    var response = await request.close();
    print('Response status: ${response.statusCode}');
  } finally {
    client.close();
  }
}

我们创建一个 HttpClient 并设置基本身份验证。凭据会自动转换为正确的 Authorization 标头字符串。

$ dart main.dart
Response status: 200

处理身份验证错误

此示例演示了基本身份验证的错误处理。

main.dart
import 'dart:io';

void main() async {
  var client = HttpClient();
  
  try {
    var request = await client.getUrl(Uri.parse('https://example.com/api'));
    
    var credentials = HttpClientBasicCredentials('wrong', 'credentials');
    request.headers.set('Authorization', credentials.toString());
    
    var response = await request.close();
    
    if (response.statusCode == HttpStatus.unauthorized) {
      print('Authentication failed');
    } else {
      print('Response status: ${response.statusCode}');
    }
  } finally {
    client.close();
  }
}

当凭据无效时,我们会检查 401 Unauthorized 状态码。该示例展示了对身份验证失败的正确错误处理。

$ dart main.dart
Authentication failed

与 HttpClientRequest 一起使用

此示例展示了与 HttpClientRequest 的直接用法。

main.dart
import 'dart:io';

void main() async {
  var client = HttpClient();
  
  try {
    var request = await client.postUrl(Uri.parse('https://example.com/api'));
    
    var credentials = HttpClientBasicCredentials('admin', 'secret');
    request.addCredentials(credentials);
    
    request.write('{"data": "value"}');
    var response = await request.close();
    
    print('Response status: ${response.statusCode}');
  } finally {
    client.close();
  }
}

我们使用 addCredentials 方法,而不是手动设置标头。这是将身份验证添加到 HttpClientRequest 的首选方法。

$ dart main.dart
Response status: 200

多次身份验证尝试

此示例展示了处理多次身份验证尝试。

main.dart
import 'dart:io';

void main() async {
  var client = HttpClient();
  
  var credentials = [
    HttpClientBasicCredentials('user1', 'pass1'),
    HttpClientBasicCredentials('user2', 'pass2')
  ];
  
  for (var cred in credentials) {
    try {
      var request = await client.getUrl(Uri.parse('https://example.com/api'));
      request.addCredentials(cred);
      
      var response = await request.close();
      if (response.statusCode == HttpStatus.ok) {
        print('Authenticated as ${cred.username}');
        break;
      }
    } catch (e) {
      print('Failed with ${cred.username}: $e');
    }
  }
  
  client.close();
}

我们尝试多个凭据对,直到成功身份验证。当使用多个可能的帐户时,此模式很有用。

$ dart main.dart
Failed with user1: HttpException
Authenticated as user2

安全凭据处理

此示例演示了安全的凭据管理实践。

main.dart
import 'dart:io';

class SecureAuth {
  final String _username;
  final String _password;
  
  SecureAuth(this._username, this._password);
  
  HttpClientBasicCredentials get credentials {
    return HttpClientBasicCredentials(_username, _password);
  }
}

void main() async {
  var auth = SecureAuth('secureUser', 's3cr3tP@ss');
  var client = HttpClient();
  
  try {
    var request = await client.getUrl(Uri.parse('https://example.com/api'));
    request.addCredentials(auth.credentials);
    
    var response = await request.close();
    print('Response status: ${response.statusCode}');
  } finally {
    client.close();
  }
}

我们将凭据封装在一个安全类中,以防止意外泄露。此模式有助于在处理身份验证时维护安全性。

$ dart main.dart
Response status: 200

最佳实践

来源

Dart HttpClientBasicCredentials 文档

本教程通过实际示例介绍了 Dart 的 HttpClientBasicCredentials 类,展示了身份验证模式和安全注意事项。

作者

我叫 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Dart 教程