Flutter NTLM认证插件ntlm的使用

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

Flutter NTLM认证插件ntlm的使用

NTLM

这是一个用于Dart/Flutter中的NTLM认证库。

安装

将依赖项添加到你的pubspec.yaml文件中:

dependencies:
  ntlm: ^2.0.1

示例

以下是一个完整的示例demo,展示了如何在Flutter应用中使用ntlm插件进行NTLM认证。

import 'package:ntlm/ntlm.dart';

void main() {
  // 创建一个NTLMClient实例
  var client = NTLMClient(
    domain: '', // 如果没有域名,可以留空
    workstation: 'LAPTOP', // 工作站名称
    username: 'User208', // 用户名
    password: 'password', // 密码
  );

  // 发送GET请求并处理响应
  client.get(Uri.parse('https://example.com/')).then((res) {
    print(res.body); // 打印响应体
  }).catchError((error) {
    print('请求失败:$error'); // 处理错误
  });
}

你也可以预先对密码进行哈希处理,并使用这些结果:

String lmPassword = lmHash("password"); // 计算LM哈希
String ntPassword = ntHash("password"); // 计算NT哈希

var client = NTLMClient(
  domain: '',
  workstation: 'LAPTOP',
  username: 'User208',
  lmPassword: lmPassword, // 使用预计算的LM哈希
  ntPassword: ntPassword, // 使用预计算的NT哈希
);

如果您的服务器仅支持Negotiate认证方案,您可以使用headerPrefix参数更改头前缀为Negotiate

var client = NTLMClient(
  domain: '',
  workstation: 'LAPTOP',
  username: 'User208',
  password: 'password',
  headerPrefix: kHeaderPrefixNegotiate, // 使用Negotiate前缀
);

注意,这仍然只使用NTLM认证方案,而不是Kerberos。

Flutter Web支持

对于跨域请求,请确保您的服务器在响应中包含以下标头:

Access-Control-Allow-Origin: <your_origin>
Access-Control-Expose-Headers: WWW-Authenticate
Access-Control-Allow-Headers: Authorization
Access-Control-Allow-Credentials: true

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

1 回复

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


在处理Flutter应用中的NTLM认证时,使用第三方插件可以大大简化开发过程。ntlm插件是一个流行的选择,用于在Flutter应用中实现NTLM认证。以下是一个如何使用ntlm插件进行NTLM认证的代码案例。

首先,确保你已经在pubspec.yaml文件中添加了ntlm依赖:

dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.3  # 用于HTTP请求
  ntlm: ^1.0.3   # NTLM认证插件

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

接下来,在你的Dart代码中,你可以按照以下步骤使用ntlm插件进行NTLM认证:

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

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

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

class _MyAppState extends State<MyApp> {
  String responseData = '';

  void _performNTLMAuth() async {
    String url = 'http://your-ntlm-protected-server/api/resource'; // 替换为你的NTLM保护资源的URL
    String username = 'your-username'; // 替换为你的用户名
    String password = 'your-password'; // 替换为你的密码
    String domain = 'your-domain'; // 替换为你的域(如果适用)

    // 创建NTLM认证头
    var ntlm = NTLM(username, password, domain);
    var authHeader = ntlm.getType1Message();

    // 发送初始请求以获取Type2消息
    var response = await http.get(
      Uri.parse(url),
      headers: <String, String>{
        'Authorization': authHeader,
      },
    );

    if (response.statusCode == http.Status.Unauthorized) {
      // 从响应中提取Type2消息
      var challenge = response.headers.value('www-authenticate')?.split(' ')?.firstWhere((headerPart) => headerPart.startsWith('NTLM '))?.substring(5);
      if (challenge != null) {
        var type2Message = NTLMMessage.parse(base64Decode(challenge));
        var type3Message = ntlm.getType3Message(type2Message, Uri.parse(url).path);

        // 使用Type3消息发送最终请求
        var finalResponse = await http.get(
          Uri.parse(url),
          headers: <String, String>{
            'Authorization': 'NTLM ' + base64Encode(type3Message.toBytes()).toString(),
          },
        );

        // 处理响应
        setState(() {
          responseData = finalResponse.body;
        });
      } else {
        setState(() {
          responseData = 'Failed to extract NTLM challenge from server response.';
        });
      }
    } else {
      setState(() {
        responseData = 'Unexpected server response status code: ${response.statusCode}';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter NTLM Authentication Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: _performNTLMAuth,
                child: Text('Perform NTLM Authentication'),
              ),
              SizedBox(height: 20),
              Text(responseData),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们首先导入了必要的包,包括http用于HTTP请求和ntlm用于NTLM认证。然后,我们创建了一个Flutter应用,其中包含一个按钮用于触发NTLM认证流程。

_performNTLMAuth函数中,我们:

  1. 设置了目标URL、用户名、密码和域。
  2. 创建了一个NTLM对象并生成了Type1消息。
  3. 发送了一个带有Type1消息的HTTP GET请求以获取服务器的Type2消息。
  4. 从服务器的响应中提取Type2消息,并使用它生成Type3消息。
  5. 发送一个带有Type3消息的HTTP GET请求,并处理最终的响应。

注意:这个示例假设服务器在401 Unauthorized响应中返回了正确的NTLM挑战(Type2消息)。此外,由于NTLM认证涉及敏感信息,确保在实际应用中妥善处理这些信息,例如通过安全存储和传输机制。

在实际部署之前,请确保对代码进行适当的错误处理和安全性检查。

回到顶部