从有权限控制的 HTTP 服务中读取数据
集算器SPL语言中提供了httpfile函数用于读取HTTP页面的数据。但为了数据的安全性,有些服务器会对访问数据者的身份进行认证,只有通过认证的访问才能读取到页面数据。常用的身份认证分为两大类,一类是用户访问认证页面后,服务器将认证后的信息记录在Session并将Session号发回客户端的Cookie中,或者将认证信息也发回客户端的Cookie中。当要访问有权限控制的页面数据时,需要将Cookie中保存的内容放在申请头中,服务器就能判断出访问者的身份,从而决定是否允许访问此页数据。另一类是用户访问认证页面后,服务器返回一个访问令牌Token,在令牌有效期内,访问有权限控制页面数据时将Token作为参数传回就可以了。
在SPL中如何完成身份认证的步骤并访问到有权限控制的数据呢?
1. 服务器在Session或Cookie保存身份认证
乾学院中有内部帖子栏目,只有经身份认证为内部员工,才能阅读帖子内容。
A |
|
1 |
=httpfile("https://c.raqsoft.com.cn/article/1628656263716") |
2 |
=A1.read() |
如果象上面这样直接去读取帖子内容,在A2返回的内容中会发现“没有权限”的字样,并不能取到页面的真正内容。下面这段SPL脚本是经过认证后再去读取:
A |
|
1 |
=httpfile("https://c.raqsoft.com.cn/login4get?nameOrEmail=tom&userPassword=900150983CD24FB0D6963F7D28E17F72&rememberLogin=true") |
2 |
=A1.read() |
3 |
=A1.property("Set-Cookie") |
4 |
=httpfile("https://c.raqsoft.com.cn/article/1628656263716";"Cookie":A3) |
5 |
=A4.read() |
A1 定义httpfile对象访问乾学院的登录接口页面,此处所传密码是用户原始密码经MD5加密后的串
A2 读取认证页面的返回内容,完成认证。返回内容中一般会显示出是否认证成功
A3 从这次认证申请的响应头中读取Set-Cookie属性值,它就是要写入到客户端Cookie的内容
A4 定义访问内部帖子的httpfile对象,把A3的内容放入申请头的Cookie中
A5 读取内部帖子的内容,返回的就是帖子的真正内容了
访问者需要知道服务器的登录接口,提供数据的服务商会在相关的文档中有说明。本例中是以GET方式提交的,有些接口会要求是POST方式,或者只能是JSON格式提交,httpfile函数都提供了支持。
2. 服务器返回Token
这里不举具体的例子了,写一下一般性的过程:
A |
|
1 |
=httpfile("https://xxxxxx","{\"userId\":\"abc\",\"password\":\"sdfikje87kd908\"}";"Content-Type":"application/json") |
2 |
=A1.read() |
3 |
=json(A2).accessToken |
4 |
=httpfile("https://xxxxxx","{\"accessToken\":\""+A3+"\",\"other\":\"xxx\"}";"Content-Type":"application/json") |
5 |
=A4.read() |
A1 定义httpfile对象访问登录接口页面,示例中以JSON格式提交用户名、密码或所需的其它参数。实际使用中用什么方式提交视服务器要求而定
A2 读取认证页面的返回内容,完成认证。返回内容中一般会显示出是否认证成功,成功后返回内容中会含有accessToken以及有效时长等方面的信息
A3 假如返回内容是JSON格式,将内容转成JSON对象并取得accessToken的值
A4 定义访问有权限控制页面的httpfile对象,此处假定服务器要求以JSON格式提供参数,把A3的内容作为accessToken参数值,同时传递其它必需的参数
A5 读取所需访问的数据
笔者受知识面所限,如还有未知的其它认证方式,留待以后探讨。