gpt4 book ai didi

flutter 升级后带有基本身份验证问题的 Dart HttpClient

转载 作者:IT王子 更新时间:2023-10-29 07:08:46 24 4
gpt4 key购买 nike

在大量浏览和阅读文档之后,我遇到了这个 answer ,它一直有效,直到我升级了 flutter。

我当前的问题是凭据未到达我的服务器。IntelliJ 错误:

I/FlutterActivityDelegate( 6944): onResume setting current activity to this
D/EGL_emulation( 6944): eglMakeCurrent: 0xa7f852a0: ver 2 0 (tinfo 0xa7f83250)
I/flutter ( 6944): doing login with credentials:: W and T
I/flutter ( 6944): my_response is:: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
I/flutter ( 6944): <title>429 Too Many Requests</title>
I/flutter ( 6944): <h1>Too Many Requests</h1>
I/flutter ( 6944): <p>1 per 1 minute</p>
E/flutter ( 6944): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter ( 6944): type '(Exception) => void' is not a subtype of type '(Object) => FutureOr<dynamic>'

我的请求的服务器输出是:

 credentials::  - 
192.168.1.175 - - [12/May/2018 10:56:23] "GET /users/login HTTP/1.1" 401 -
192.168.1.175 - - [12/May/2018 10:56:23] "GET /users/login HTTP/1.1" 429 -

LE:“credentials::-”是在服务器的身份验证级别完成的打印。LLE:curl 请求工作正常

curl -u 123456:password http://localhost:5000/users/login 
{
"is_logged_in": true,
"last_login": 1525980360
}

响应是:

credentials:: 123456 - password
127.0.0.1 - - [12/May/2018 13:00:50] "GET /users/login HTTP/1.1" 200 -

我使用的代码与上面提供的链接中的代码完全相同。

最佳答案

这里是总结评论中的讨论的摘要答案。

似乎 Too Many Requests 错误可能是由 HTTP 客户端与需要授权的服务器对话的典型行为触发的。

GET ->
<- 401 Unauthorized + scheme + realm (and nonce if applicable)
GET with Authorization header ->
<- 200 OK (if credentials are valid)

看起来服务器可能已将第一个 GET/401 计入某种每分钟请求限制。

然而,来自 curl 的请求是成功的,可能是因为 curl 在第一个 GET 时抢先发送了 Authorization header ,而不是等待 401 请求。只要授权方案是 Basic 就可以做到这一点 因为它不需要来自服务器的任何信息。 (它不适用于 Digest,因为如果没有随 401 发送的随机数,它无法计算授权 header 。)

那么问题来了,有没有办法在package:http中抢先发送Basic auth?

正常方式 - 仅响应 401 发送

// create an IOClient with authentication
HttpClient inner = new HttpClient();
inner.authenticate = (uri, scheme, realm) {
inner.addCredentials(
uri, realm, new HttpClientBasicCredentials(username, password));
};
http.IOClient client = new http.IOClient(inner);

// and use it like this
http.Response response = await client.get('https://api.somewhere.io');
// todo - handle the response

抢占方式 - 仅适用于基本身份验证

// use the normal http.get method, but add the header manually, with every request
http.Response response = await http.get(
'https://api.somewhere.io',
headers: {'authorization': basicAuthenticationHeader(username, password)},
);
// todo - handle the response

用实用方法

String basicAuthenticationHeader(String username, String password) {
return 'Basic ' + base64Encode(utf8.encode('$username:$password'));
}

关于flutter 升级后带有基本身份验证问题的 Dart HttpClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50305479/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com