如何在本机应用程序中实现NTLM身份验证?

时间:2019-07-18 08:25:19

标签: node.js reactjs react-native ntlm

嘿,我正在努力在React Native应用程序中实现NTLM身份验证。我正在使用这个库https://github.com/SamDecrock/node-http-ntlm,但是为了使其正常工作,我首先必须从https://github.com/parshap/node-libs-react-nativehttps://github.com/itinance/react-native-fs中为fs添加大量节点核心模块,甚至在其中添加js-md4 httpntlm库本身可以获取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));
    }
  };

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

在我尝试从我们服务器上的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