在接口测试中,鉴权(Authorization)是验证请求方是否有权限访问特定资源的关键步骤。鉴权主要是验证用户是否有权限访问某个接口,确保安全性,因为很多接口都需要验证用户的身份和权限,否则会有安全风险。
#接口测试# #测试工程师# #软件测试#
常见的鉴权方式有哪些,可能包括Basic Auth、Token、OAuth、JWT、API Key、HMAC,还有签名验证这些,鉴权方法时需要注意哪些点,比如参数的位置是否正确,Token是否过期,还有权限控制是否严格,这些都是测试过程中容易出问题的地方。
对于Basic Auth,测试时需要在请求头中添加Authorization字段,值为Base64编码的用户名和密码。对于Token,可能是在请求头或参数中传递,比如Bearer Token。OAuth的话,可能涉及获取access token的流程,测试时需要先获取token再调用接口。
还要考虑测试用例的设计,比如正常情况下的鉴权通过,以及异常情况,比如无效的token、过期的token、缺少鉴权信息等。这些用例能覆盖鉴权的不同场景,确保接口的安全性。
在自动化测试中的鉴权处理,比如在自动化框架中,如何维护token的生命周期,比如登录获取token后,在后续请求中复用,直到token过期需要重新获取。这时候可能需要处理token的刷新机制,或者测试用例之间的依赖关系。
可能还需要考虑不同环境下的鉴权配置,比如测试环境、预发布环境和生产环境的鉴权策略是否一致,或者是否有模拟的测试账号供测试使用。
还有一点鉴权和认证不要弄混肴了,鉴权是验证权限,认证是验证身份。
原理:将用户名和密码用 Base64 编码后放在请求头 Authorization 中。
测试方法:
http
GET /api/resource HTTP/1.1
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
正确用户名密码能否访问。
错误凭证是否返回 401 Unauthorized。
原理:用户登录后获取 Token,后续请求在 Header 中携带 Token(如 Bearer Token)。
测试方法:
http
GET /api/data HTTP/1.1
Authorization: Bearer <token>
测试场景:
Token 是否有效(过期、伪造、篡改)。
缺少/未传 Token 时返回 401。
通过 Refresh Token 续期逻辑。
原理:通过授权服务器获取 Access Token(如授权码模式、客户端模式)。
测试步骤:
模拟获取 Authorization Code。
用 Code 换取 Access Token。
携带 Token 访问受保护接口。
验证点:Token 权限范围(Scope)、Token 过期和刷新逻辑。
原理:Token 中包含用户信息和签名,服务端通过验证签名和内容鉴权。
测试方法:
解码 JWT 验证 Payload(如用户角色、过期时间)。
篡改 JWT 内容,验证服务端是否拒绝。
测试不同角色(Role)的权限控制。
原理:客户端在请求头或参数中携带唯一的 API Key。
测试方法:
http
GET /api/data?api_key=123456 HTTP/1.1
验证点:Key 是否有效、是否绑定 IP 或域名、频率限制。
原理:客户端用密钥对请求参数生成签名,服务端验证签名。
测试方法:
修改参数后验证签名是否失效。
时间戳防重放(如时间偏差超过 5 分钟拒绝)。
原理:通过登录后返回的 SessionID 维持会话。
测试步骤:
调用登录接口,获取 Set-Cookie 头中的 SessionID。
在后续请求中携带 Cookie: SessionID=xxx。
测试用例:
登录后能否携带有效 Cookie 访问。
Cookie 过期或无效是否返回 401。
Token 鉴权:在请求头中添加 Authorization: Bearer <token>。
环境变量:将 Token 设为环境变量,避免硬编码。
自动化脚本:在 Pre-request Script 中动态获取 Token。
python
import requests# 获取 Tokenlogin_url = "https://api.example.com/login"response = requests.post(login_url, json={"username": "user", "password": "pass"})token = response.json()["token"]# 携带 Token 访问受保护接口api_url = "https://api.example.com/data"headers = {"Authorization": f"Bearer {token}"}response = requests.get(api_url, headers=headers)print(response.status_code) # 预期 200
正向用例:有效鉴权信息,返回 200 OK。
合法用户能否正常访问受保护接口。
权限边界测试(如普通用户能否访问管理员接口)。
反向用例:
无鉴权信息:返回 401 Unauthorized。
无效 Token:返回 403 Forbidden。
权限不足:普通用户访问管理员接口,返回 403。
签名错误:修改参数或签名,返回 400 Bad Request。
非法用户尝试越权访问。
鉴权信息是否通过 HTTPS 传输。
Token 是否可被篡改或复用。
Postman:
在请求的 Authorization 标签页配置鉴权方式(如 Bearer Token)。
使用变量管理 Token(如 {{token}}),通过前置脚本自动获取。
JMeter:
添加 HTTP Header Manager,配置 Authorization: Bearer ${token}。
使用 JSON Extractor 从登录响应中提取 Token。
Python Requests:
python
headers = {"Authorization": f"Bearer {token}"}response = requests.get(url, headers=headers)
在自动化框架中,需处理 Token 的获取、刷新和失效:
python
# 示例:登录获取 Tokendef get_token(): resp = requests.post(login_url, data={"username": "admin", "password": "123"}) return resp.json()["token"]# 在测试用例中复用 Tokentoken = get_token()headers = {"Authorization": f"Bearer {token}"}
使用 pytest 的 fixture 管理鉴权前置条件:
python
import pytest@pytest.fixture(scope="session")def auth_token(): token = get_token() # 登录获取 Token yield token # 测试结束后可添加 Token 注销逻辑
敏感信息(如密码、Token)避免明文传输,使用 HTTPS。
测试环境与生产环境使用不同的密钥。
Header、URL 参数、Body 中的鉴权字段需符合接口定义。
处理 Token 过期逻辑(如自动刷新)。
验证不同角色(Role)的接口访问权限。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。