从有权限控制的 HTTP 服务中读取数据

集算器SPL语言中提供了httpfile函数用于读取HTTP页面的数据。但为了数据的安全性,有些服务器会对访问数据者的身份进行认证,只有通过认证的访问才能读取到页面数据。常用的身份认证分为两大类,一类是用户访问认证页面后,服务器将认证后的信息记录在Session并将Session号发回客户端的Cookie中,或者将认证信息也发回客户端的Cookie中。当要访问有权限控制的页面数据时,需要将Cookie中保存的内容放在申请头中,服务器就能判断出访问者的身份,从而决定是否允许访问此页数据。另一类是用户访问认证页面后,服务器返回一个访问令牌Token,在令牌有效期内,访问有权限控制页面数据时将Token作为参数传回就可以了。

SPL中如何完成身份认证的步骤并访问到有权限控制的数据呢?

1.   服务器在SessionCookie保存身份认证

乾学院中有内部帖子栏目,只有经身份认证为内部员工,才能阅读帖子内容。


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   读取所需访问的数据

 

笔者受知识面所限,如还有未知的其它认证方式,留待以后探讨。