龙空技术网

阿里云物联网平台使用心得(34)HTTP协议第1步之获取认证令牌

超子说物联网 76

前言:

目前大家对“阿里云的ip能查出来吗”大约比较关心,小伙伴们都想要分析一些“阿里云的ip能查出来吗”的相关资讯。那么小编也在网摘上收集了一些对于“阿里云的ip能查出来吗””的相关资讯,希望各位老铁们能喜欢,朋友们一起来了解一下吧!

题目

大家好,超子又和大家见面了,超子我能力有限,水平不高,有什么错误的地方,欢迎板砖。超子接下来介绍如何构建HTTP的报文,对接阿里云物联网平台上传数据。总的来说我们需要经过两步走。

第1步:认证,通过HTTP报文上报设备的三元组等信息,进行认证,上报信息准确的话,服务器会在回复的报文中,下发认证的令牌token,目前平台token支持的有效期是7天。

第2步:上传数据,每次上传需要携带第1步下发的令牌token,如果过了有效期,需要再次认证,然后携带新的token令牌上传数据。

在讲解具体的报文构建之前,我们先要了解HTTP报文的结构,分为3个部分。

请求行:包含请求方法,比如上一篇文章提到的GET或是POST,然后还有URL以及HTTP协议版本,阿里云用的版本是HTTP/1.1,至于URL,我们等到具体构建报文的时候再看 。

请求头部( header ):包含一些关键的消息,阿里云会告诉你必须包含的头部,后面我们在具体看

请求数据(body):POST方法需要body,因为POST是上传数据,body就是要上传的数据内容。

我们看上图,阿里云给出了请求行和请求头部( header )以及请求数据(body)的例子和说明。上图例子中的请求头部( header )有HOST和Content-Type,但是少一个Content-Length,表示请求数据(body)有多少个字节,POST方法必须有,但是图中没有给出,这点要注意一下,可能阿里云觉得大家都应该知道POST需要Content-Length,所以上图中就没写出来。

上图中POST /auth HTTP/1.1是请求行,其中POST是请求方法,/auth 是URL地址,HTTP/1.1是使用的版本,请求行必须完整的独占一行。

接下来看请求头部( header ),其中HOST就是我们需要访问的阿里云服务器地址,可以是IP或是域名形式,这里阿里给出的是域名。Content-Type表示阿里云要求的数据编码格式,只有满足格式要求,才能正确的解析数据,阿里需要的是json格式数据。Content-Length需要构建好body后,才能知道具体有多少字节。HOST和Content-Type以及Content-Length各自独占一行。

请求数据(body)包含着三元组的信息,是认证的关键。特别注意一点,请求头部( header )和请求数据(body)之间必须通过一个空行间隔,如果没有的话,就会出错,这一点一定要多加注意和小心。

请求数据(body)的数据格式如下:

{“clientId”:“@”,“sign”:“#”,“productKey”:“*”,“deviceName”:“$"}

其中@、#、*和$,必须替换成相应的数据,我们先拿出三元组的信息,看上图。其中*和$很直观,*是产品秘钥,$是设备名称,@是客户端ID,可以自己定义,但是长度必须在64字符内,那么@的话,我就用产品秘钥&设备名称吧,我们先搞定以上3个,结果如下:

@是:a12dTIroTJC&D001

*是:a12dTIroTJC

$是:D001

最后就差#了,#需要做一步hmacsha5加密才能得到,加密的明文如下:

clientId%sdeviceName%sproductKey%s

3个%s需要替换成相应的数据,前面我们都准备好了,注意clientId后面的%s,就是前面的@。我们先把明文构建好,结果如下:

clientIda12dTIroTJC&D001deviceNameD001productKeya12dTIroTJC

明文一定要小心,不要多一个或是少一个字符,尤其是注意不要多空格,尤其是最后面如果多了空格,还不容易检查出来。还有就是最后面不要多回车,这个也不容易看出来。hmacsha5加密的秘钥就是三元组里的设备秘钥。

jBiRd3INpmL0zrb8XgURzP6JJOmFWMdJ

网上找一个加密网站,我们做一下加密。

一定要检查明文和秘钥后面不要多空格和回车。然后我们使用hmacsha5加密,如此一来,请求数据(body)中最后的#也就搞定了,结果如下:

2f93c54d09f22eefacd04cf7cd826159

把@、#、*和$全部替换,最终的请求数据(body)结果如下:

{"clientId":"a12dTIroTJC&D001","sign":"2f93c54d09f22eefacd04cf7cd826159","productKey":"a12dTIroTJC","deviceName":"D001"}

数据一共是120个字节,所以我们可以确定请求头部( header )中的Content-Length的值了,就是120。然后我们构建一下整个报文,结果如下

POST /auth HTTP/1.1

Host: iot-as-http.cn-shanghai.aliyuncs.com

Content-Type: application/json

Content-Length: 120

{"clientId":"a12dTIroTJC&D001","sign":"2f93c54d09f22eefacd04cf7cd826159","productKey":"a12dTIroTJC","deviceName":"D001"}

一定要注意, header和body之间,要有一个空行,绝对不能少了。接下来用网络调试助手实测一下。首先建立TCP连接,远程主机地址和端口号如下所示:

iot-as-http.cn-shanghai.aliyuncs.com:80

我们先建立TCP连接,然后把认证报文发给阿里云服务器,上图我们可以看到,如果我们的报文构建正确,阿里云会回复相应的数据,上图中红圈标注的,就是阿里云返回给我们的令牌token,我们接下来发送具体数据的时候,就要用到token了。这部分内容下次超子再给大家介绍。

标签: #阿里云的ip能查出来吗