首页 > 解决方案 > 颤振应用程序使用摘要身份验证连接到 ip 相机

问题描述

我正在尝试在我的网络摄像机上传递摘要身份验证,我在 Flutter 上执行此操作,但实际上没关系。我收到来自相机的 http 响应,状态码为 401 Not Authorized 和标头:

{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}

从这里的源代码中,我找到了所需的响应构造函数视图,如下所示:

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 camera 获取快照。我不确定 Uri 参数。当我尝试在台式机屏幕截图上通过 http 客户端发送此 http 请求时出现相同的错误

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

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

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

PS 经过多次测试来解决这个问题,我认为我的参数值是正确的,因为如果更改某些内容,例如用户名、密码等(除了 cnonce。当我更改 сnonce 结果相同),我得到其他错误:401。

Android studio 出现错误截图

标签: flutterdartdigest-authenticationonvif

解决方案


手工编写 SOAP 请求是不好的做法。我对 dart 一无所知,但我邀请您寻找像 gsoap 这样的工具,用于从您可以在此处找到的 thw WSDL 文件生成函数。不要手动编写请求,解析响应时会一团糟。


推荐阅读