写在前面

最近做了几个项目的接口测试接入工作,主要是结合星海后台测试平台(内部的统一接口测试平台)完成各个项目基础框架的搭建,并结合项目实际情况使用普通模式编写用例(通过网页编辑,填空式)和高级模式(直接编写代码),来提升接口测试的整体效率。

身份认证

几乎所有项目遇到的首个问题就是身份认证。因为大部分接口都不允许、也不应该匿名使用,所以一般都会通过 HTTP Header 或 URL 中的 Query String 携带一个令牌(token),来表明用户身份。

一般来讲,token 如果根据有效期来分类的话,有永久有效(当然可以后台手动吊销)和一定时间内有效两类。根据权限又可以分为完全权限和指定作用阈。根据项目实际情况,可能还有更多的划分。

一个典型的认证流程:

  1. 用户向服务器发送用户名和密码。

  2. 服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。

3.服务器向用户返回一个 session_id,写入用户的 Cookie。

4.用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。

5.服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。

这种模式的问题在于,扩展性(scaling)不好。单机当然没有问题,如果是服务器集群,或者是跨域的服务导向架构,就要求 session 数据共享,每台服务器都能够读取 session。
所以,后来又有了 JWT(JSON Web Token) 方案。详细的原理和用法这里就不展开了,可以读一下阮一峰的《JSON Web Token 入门教程》,或 Auth0 出品的《JWT Handbook》。
另外,前面提到的典型认证流程,第一步是通过用户名和密码认证。但是对于第三方服务(例如饿了么之于微信),还会用到 OAuth2.0 的标准。简单描述就是,用户点击 “同意” 授权,由微信和饿了么在后台完成鉴权,最后颁发一个短期有效的令牌。具体的原理也可以通过阮一峰的《理解 OAuth 2.0》了解。

身份认证与接口测试

接口测试的设计中,独立性是一个十分重要的原则。这就要求我们编写的每条测试用例是可以独立执行、互不影响的。并且很多时候为了提高效率,接口测试都是并发执行。这样一来,每个用例如果都先完成身份认证流程,再走正常逻辑,这样给身份认证接口带来很多不必要的压力。另一方面,如果后台一般会对此接口进行频率限制(防止暴力破解),则会导致测试失败。

所以,为了解决这个问题,我们需要引入一个外部服务,来完成 “统一认证” 流程。

并发的情况下,要保证 token 有效,方案相对复杂,详细的讨论可以看这篇帖子:《高并发如何保证微信 access_token 的有效》。

腾讯云实战

前面提到了并发情况下 token 有效性的问题,《高并发如何保证微信 access_token 的有效》文中对单进程、多进程等场景提供了多种方案。虽然照做可以解决问题,但是还需要独立的服务器部署和维护,对于我们来说成本太高。腾讯云提供了无服务器云函数(Serverless Cloud Function,SCF)、API 网关(API Gateway)和对象存储(COS)三种产品,并且都有非常大的免费额度,我们几乎不用为此付费即可搭建一个稳定的统一身份认证服务。

所以我们的具体方案可以优化为:

统一登录服务定时(假设一般 token 2 小时过期,我们每个小时去请求一次)去后台请求新的 token,并将其序列化存储到 COS ;对于旧的 token,每次请求新 token 时验证其有效期,如果有效期不足(例如小于 5 分钟)则从 COS 中删除。

具体使用 token 时,直接去 COS 中获取即可,本地验证有效性后使用。

下面简述一下开发流程:

首先,在 COS 中创建一个 Bucket,用于数据持久化(也可以用数据库代替)。
在 SCF 中创建函数服务,选择一门你熟悉的语言环境,编写核心代码,并进行测试。完成后,添加触发方式为定时触发(即定时刷新 token)
在 API Gateway 中,创建接口。其中,后端使用 cloud function,然后选择上一步创建的函数。
测试环境进行测试,没问题后发布到正式环境。如果有需要,还可以绑定自定义域名。
需要注意:

因为是把服务发布到了外网,所以一定要注意安全问题。可以查询相关文档的最佳实践,有详细说明

COS 中建议存储多个有效的 token,本地使用时先验证有足够的有效期(防止 case 执行过程中过期)再使用

如果是 token 是 JWT 形式的,可以直接解析出过期时间等数据;如果是其他格式,需要自己维护一个字段用来保存有效期等属性

对于类似 OAuth2.0 这种需要外部授权的服务,简单的可以直接实现,复杂的(如微信)借助手机自动化来实现。

写在最后

十分感谢 Edsion 同学的分享,转自 Edsion 同学的博客 https://blog.i1hao.com/2018/10/08/oauth-and-api-test/


↙↙↙阅读原文可查看相关链接,并与作者交流