嘿,我正在努力在React本机应用程序中实现NTLM身份验证。我正在使用该库https://github.com/SamDecrock/node-http-ntlm,但是为了使其正常工作,我首先必须从https://github.com/parshap/node-libs-react-nativehttps://github.com/itinance/react-native-fs中为fs添加大量节点核心模块,甚至在httpntlm库本身中添加js-md4以获得md4。哈希以使密码起作用。

长话短说,我认为即使在第一个请求之后连接仍然关闭,因为我的身份验证由于凭据无效而失败。

我在node.js本地服务器中使用https测试了相同的代码和库,并且可以正常工作,因此不是凭据本身无效。

关于如何在react-native中实现此身份验证的任何提示?

这是sendMessage1()的响应:

{
    "type": "default",
    "status": 401,
    "ok": false,
    "headers": {
        "map": {
            **"connection": "close",**
            "server": "Microsoft-HTTPAPI/2.0",
            "www-authenticate": "NTLM veryLongHash",
            "date": "Wed, 17 Jul 2019 14:15:34 GMT",
            "content-type": "text/html; charset=us-ascii",
            "content-length": "341"
        }
    },
    "url": "https://myAppUrl",


}

这是代码:

  const keepAliveAgent = new https.Agent({
    keepAlive: true
  });

  const options = {
    url,
    username: 'Username',
    password: 'Password',
    workstation: '',
    domain: ''
  };


  const type1msg = ntlm.createType1Message(options);

  const sendType1Message = async () => {
    await fetch(url, {
      headers: {
        Accept: '*/*',
        Connection: 'keep-alive',
        Authorization: type1msg
      },
      keepAlive: true,
      allowRedirects: false,
      agent: keepaliveAgent
    })
      .then(res => setImmediate(() => sendType3Message(res)))
      .catch(error => console.log('Error in send message1', error));
  };

  const sendType3Message = async res => {
    console.log('CONNECTION', res.headers.get('connection')); // Returns 'close'

    if (!res.headers.get('www-authenticate')) {
      console.log('Auth error: www-authenticate not found on response of second request');
    } else {
      const type2msg = ntlm.parseType2Message(res.headers.get('www-authenticate'));
      const type3msg = ntlm.createType3Message(type2msg, options);
      await RNFetchBlob.fetch('GET', url, {
        Accept: '*/*',
        Connection: 'Close',
        Authorization: type3msg
      })
        .then(data => console.log('RESULT', data.data))
        .catch(e => console.log('Error', e));
    }
  };


很感谢任何形式的帮助!

最佳答案

在尝试从我们服务器上的Sharepoint Application获取数据之前,我遇到了该问题。

我没有使用任何React本机软件包来解决此问题。我为请求编写了本机模块(适用于Android的Java和适用于iOS的Objective-C),并通过回调将数据带回了JS端。

您可以在此处找到有关如何编写自己的本机模块的示例:

iOS:https://facebook.github.io/react-native/docs/native-modules-ios

Android:https://facebook.github.io/react-native/docs/native-modules-android

关于node.js - 如何在 native 应用程序中实现NTLM身份验证?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57090156/

10-16 19:37