flutter应用通过摘要身份验证

时间:2019-12-26 16:49:21

标签: flutter dart digest-authentication onvif

我正在尝试在IP摄像机上传递摘要身份验证 我在Flutter上做,但实际上没关系。 我从状态码为401的摄像头收到HTTP响应 和标题:

{content-type: text/html, pragma: no-cache, cache-control: no-cache, www-authenticate: Digest 
realm="goAhead", domain=":13237",qop="auth", nonce="a98326cc6022c2a2b7cc7e57a5956f77", 
opaque="5ccc069c403ebaf9f0171e9517f40e41",algorithm="MD5", stale="FALSE", date: Thu Dec 26 16:31:43 
2019, server: GoAhead-Webs}

在此source中,我找到了所需的Response构造函数视图,如下所示:

var mResponse = "Digest username=\"$username\", realm=\"$realm\", nonce=\"$nonce\", uri=\"$uri\", 
                response=\"$_response\", cnonce=\"$cnonce\", nc=$nc, qop=\"$qop\"";

我创建了这个

Digest username="admin", realm="goAhead", nonce="a98326cc6022c2a2b7cc7e57a5956f77", 
uri="/onvif/device_service", response="5313fe5265efcd3da37cec322d92ebd7", cnonce="1234567890", 
nc=00000001, qop="auth"

并将http请求发送到相机:

Future<http.Response> new_response = http.post(snapshotUrl, headers: {"Content-Type":"text/xml; charset=utf-8", "Authorization": mResponse }, body: mGetSnapshotUriAuth);
         new_response.then((resp){
           print(resp.statusCode);
         });

并收到此错误:

[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: Invalid header field name

当我删除标题的“授权”字段时,摄像机将显示401代码。 我正在尝试从在Onvif协议上工作的IP摄像机获取快照。我不确定Uri参数。 当我尝试通过台式机screenshot上的http客户端发送此http请求时出现相同的错误

问题2 :   当我尝试将uri参数更改为其他内容时,例如:

String uri = http://www.onvif.org/ver10/media/wsdl/GetSnapshotUri";

我的相机停止回复我。当我开始使用Http嗅探器或更改Digest响应的字段名称时,可以看到相同的行为。有时,重置相机会有所帮助(甚至是硬重置),并且相机会再次开始工作(返回401错误),有时它会自行开始工作。但顺便说一下,相机可以通过其他Camera Viewer Apps继续工作。 My screenshot from http sniffer

PS经过大量测试解决了这个问题后,我认为我的参数值是正确的,因为如果更改用户名,密码等内容(cnonce除外。当我更改nonce结果相同时),则会收到另一个错误:401。

screenshot of Android studio with error

1 个答案:

答案 0 :(得分:0)

用手编写SOAP请求是 BAD PRACTICE 。我对dart一无所知,但我邀请您寻找gsoap之类的工具,该工具可以从here的WSDL文件中生成函数。 不要用手写下请求,解析响应时会陷入混乱。