jck28-lucio-接口鉴权的多种情况与解决方案

接口鉴权是什么

接口鉴权通用的解决方案

  • 认证信息的获取
  • 认证信息的携带

@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 鉴权

  1. cookie 的获取(根据接口文档获取)
  2. 发送携带 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 鉴权

  1. token 的获取(根据接口文档获取)
  2. 发送携带 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);  
    }
}