接口鉴权是什么
- 身份认证
接口鉴权通用的解决方案
- 认证信息的获取
- 认证信息的携带
@startuml
if (登录成功?) then
#pink:响应错误;
detach
endif
#palegreen:响应认证信息;
#palegreen:携带认证信息发起其他请求;
@enduml
后端接口鉴权常用方法
@startmindmap
* 常用方式
** cookie
*** 1. 携带身份信息请求认证
*** 2. 之后的每次请求都携带cookie信息,cookie记录在请求头中
** token
*** 1. 携带身份信息请求认证
*** 2. 之后的每次请求都携带token认证信息
*** 3. 可能记录在请求头,可能记录在url参数中
** auth
*** 每次请求携带用户的username和password,并对其信息加密
** oauth2(选修)
*** 1. 携带身份信息请求认证
*** 2. 服务端向指定回调地址回传code
*** 3. 通过code获取token
*** 4. 之后的请求信息都携带token。
*** 典型产品 微信自动化测试
@endmindmap
cookie 鉴权
- cookie 的获取(根据接口文档获取)
- 发送携带 cookie 的请求
- 直接通过调用 cookie 方法
- 通过在 filter 中添加 cookieFilter 对象
import io.restassured.RestAssured;
import io.restassured.filter.cookie.CookieFilter;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.given;
import static io.restassured.specification.ProxySpecification.host;
public class CookieTest {
// 发起set cookie请求。服务端会返回set cookie
String setUrl = "https://httpbin.ceshiren.com/cookies/set/user/ad";
// 查看当前请求中的cookie信息
String url = "https://httpbin.ceshiren.com/cookies";
@BeforeAll
static void setUpClass(){
// 设置全局代理
RestAssured.proxy = host("localhost").withPort(8888);
// 设置全局忽略证书认证
RestAssured.useRelaxedHTTPSValidation();
}
@Test
void addCookie(){
// 直接通过cookie方法,添加cookie
given().cookie("user", "ad").when().get(url).then().log().all();
}
@Test
void addCookieByFilter(){
CookieFilter cookieFilter = new CookieFilter();
// 第一次请求,不进行重定向
RestAssured.given().filter(cookieFilter).log().all().redirects().follow(false).
when().get(setUrl)
.then().log().all();
// 第二次请求,会通过cookieFilter 自动添加 user=ad cookie
RestAssured.given().filter(cookieFilter).log().all().
when().get(url)
.then().log().all();
// 第三次请求,会通过cookieFilter 自动添加 user=ad cookie
RestAssured.given().filter(cookieFilter).log().all().
when().get(url)
.then().log().all();
}
}
token 鉴权
token 的获取(根据接口文档获取)
发送携带 token 的请求(根据接口文档获取)
import io.restassured.RestAssured;
import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.given;
import static io.restassured.specification.ProxySpecification.host;
public class TokenTest {
@Test
void litemall(){
// 设置全局代理
RestAssured.proxy = host("localhost").withPort(8888);
// 设置全局忽略证书认证
RestAssured.useRelaxedHTTPSValidation();
// 登录的url
String loginUrl = "https://litemall.hogwarts.ceshiren.com/admin/auth/login";
// 查询货品的url
String goodsListUrl = "https://litemall.hogwarts.ceshiren.com/admin/goods/list";
String userData = "{\"username\": \"admin123\", \"password\": \"admin123\"}";
// 登录之后获取token
String token =
given().
body(userData).contentType("application/json").
when().
post(loginUrl).
then().
log().all().extract().path("data.token");
// 调用查询货品接口,必须添加token信息
given().
header("X-Litemall-Admin-Token", token).
when().
get(goodsListUrl).
then().
log().all().statusCode(200);
}
}
auth 鉴权(了解即可)
在基本 HTTP 身份验证中,请求包含格式为 的标头字段Authorization: Basic
其中credentials是 ID 和密码的Base64编码,由单个冒号连接:。
auth 鉴权-代码示例
package com.ceshiren.verify;
import io.restassured.RestAssured;
import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.given;
import static io.restassured.specification.ProxySpecification.host;
public class AuthTest {
@Test
void auth(){
// 定义一个代理的配置信息
RestAssured.proxy = host("localhost").withPort(8888);
// 忽略HTTPS校验
RestAssured.useRelaxedHTTPSValidation();
// 被测接口地址
String authURL = "https://httpbin.ceshiren.com/basic-auth/hogwarts/123";
given().log().all()
.auth().basic("hogwarts", "123") // 设置基本认证
.when()
.get(authURL) // 发送GET请求
.then().log().all()
.statusCode(200);
}
}
token 鉴权
- token 的获取(根据接口文档获取)
- 发送携带 token 的请求(根据接口文档获取)
import io.restassured.RestAssured;
import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.given;
import static io.restassured.specification.ProxySpecification.host;
public class TokenTest {
@Test
void litemall(){
// 设置全局代理
RestAssured.proxy = host("localhost").withPort(8888);
// 设置全局忽略证书认证
RestAssured.useRelaxedHTTPSValidation();
// 登录的url
String loginUrl = "https://litemall.hogwarts.ceshiren.com/admin/auth/login";
// 查询货品的url
String goodsListUrl = "https://litemall.hogwarts.ceshiren.com/admin/goods/list";
String userData = "{\"username\": \"admin123\", \"password\": \"admin123\"}";
// 登录之后获取token
String token =
given().
body(userData).contentType("application/json").
when().
post(loginUrl).
then().
log().all().extract().path("data.token");
// 调用查询货品接口,必须添加token信息
given().
header("X-Litemall-Admin-Token", token).
when().
get(goodsListUrl).
then().
log().all().statusCode(200);
}
}
auth 鉴权(了解即可)
- 在基本 HTTP 身份验证中,请求包含格式为 的标头字段Authorization: Basic
- 其中credentials是 ID 和密码的Base64编码,由单个冒号连接:。
auth 鉴权-代码示例
package com.ceshiren.verify;
import io.restassured.RestAssured;
import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.given;
import static io.restassured.specification.ProxySpecification.host;
public class AuthTest {
@Test
void auth(){
// 定义一个代理的配置信息
RestAssured.proxy = host("localhost").withPort(8888);
// 忽略HTTPS校验
RestAssured.useRelaxedHTTPSValidation();
// 被测接口地址
String authURL = "https://httpbin.ceshiren.com/basic-auth/hogwarts/123";
given().log().all()
.auth().basic("hogwarts", "123") // 设置基本认证
.when()
.get(authURL) // 发送GET请求
.then().log().all()
.statusCode(200);
}
}