如何阻止React-Native-Windows要求HTTP Basic Auth凭证

时间:2018-04-17 07:22:37

标签: javascript react-native basic-authentication react-native-windows

我正在使用React Native和plugin通用Windows平台来访问REST服务器上的远程资源。

当对需要通过HTTP Basic Auth授权的资源执行获取请求时,我可以为请求提供额外的“授权”标头,只要凭据正确,一切正常。

如果凭据错误,我会看到Windows-native login prompt(类似于连接到远程计算机时的那个)。此提示不由我的应用程序管理,但当底层网络连接检测到401 Unauthorized服务器响应时,似乎会自动弹出此提示。

以下是我在React Native中所做的事情:

let encodedCredentials = new Buffer(this.state.username + ":" + this.state.password).toString("base64");

let response = await fetch(this.state.serverUrl, {
    method: 'GET',
    headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
        'Authorization': "Basic " + encodedCredentials, 
    }
});

let responseJson = await response.text();

alert(responseJson);

服务器响应在提供不正确的凭据时包括:

Status Code: 401 Unauthorized
WWW-Authenticate: Basic realm="iOSResource"

请注意,本机登录提示似乎会延迟 fetch 请求的整体延迟。我可以输入错误的凭据并多次确认提示,而不会触发警报一次。只有在明确取消提示时,才会输入正确的凭据,或者尝试了几次错误的凭据等待继续进行提取。

不幸的是,这又带来了另一个问题:当在弹出提示中输入错误的凭据几次并最终“放弃”时,我可以提供我想要的任何凭据 fetch 请求,它将在以后的任何请求中向服务器提供我自己的授权标头。发送的数据将粘贴在我关闭之前在提示中输入的内容中。在这种情况下,它不会再次显示提示,并且请求立即失败。这使我无法更正我自己的应用程序中的凭据,因为它们根本不在请求中发送。我通过检查Wireshark中的传出数据确认了这一点。

我猜Windows似乎透明地篡改了拦截特殊响应代码的网络请求,并在必要时重新提示凭据,然后再将请求结果返回给实际的呼叫者。

我想在应用中处理不正确的凭据,而不是让Windows拦截请求。有没有办法抑制这个原生提示,并在Basic Auth失败的情况下立即继续使用我自己的代码?

编辑:使用Axios而不是普通的 fetch 时,行为完全相同。似乎最终都做了一个XMLHttpRequest,它以相同的方式过滤。

0 个答案:

没有答案