首先确认http的返回code,200是正常返回,401代表认证不通过。因此,当收到401请求后,就需要进行认证流程了。
首先获取收到401请求的返回中,返回头部的Www-Authenticate字段的值。
这个值是由若干个key=value结构组成,通过逗号分割的,其中opaque字段可能有,也可能没有,如下所示:
realm=12345,nonce=67890,opaque=abcde
收到这三个参数后,需要准备几个数据
nonce,就是服务器直接返回的数据
ha1 = Md5(hkuser + ":" + realm + ":" + hkpass)
hkuser,hkpass是账号密码
ha2 = Md5(method + ":" + url)
method是请求类型,如:GET,POST,PUT,DELETE,url为当前的请求链接,不包括域名。
如果请求链接为https://www.worldflying.cn/iot.html,那么url就是/iot.html
nc,是当前的请求类型(method)的第几次请求,使用8位16进制显示,如第10次请求就为0000000a
cnonce,这个是一个8位随机字符串,可包含数字与小写字母。
然后将上面的数据合成
response = Md5(ha1 + ":" + nonce + ":" + nc + ":" + cnonce + ":auth:" + ha2)
authorization = "Digest username=\"" + hkuser + "\",realm=\"" + realm + "\",nonce=\"" + nonce + "\",uri=\"" + url + "\",qop=auth,nc=" + nc + ",cnonce=\"" + cnonce + "\",response=\"" + response + "\"" + "\",opaque=\"" + opaque + "\""
注意最后一个参数就是服务器返回的opaque,如果服务器不返回opaque,这里你不要添加这个字段。
最后通过req.Header.Add("Authorization", authorization)方法添加到下次请求的头部,然后发出请求即可。
作者:沃航科技