1

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

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

如果凭据错误,我会看到Windows 本地登录提示(类似于连接到远程计算机时的提示)。这个提示不是由我的应用程序管理的,但是当底层网络连接检测到 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"

请注意,本机登录提示似乎会延迟整个提取请求。我可以输入错误的凭据并多次确认提示,而不会触发一次警报。仅当显式取消提示时,输入正确的凭据或尝试了几次错误的凭据,获取等待才会继续。

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

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

我想处理应用程序中不正确的凭据,而不是导致 Windows 拦截请求。有没有办法抑制这个本机提示并立即继续我自己的代码,以防基本身份验证失败?

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

4

0 回答 0