Apifox-Postman 請求前登錄

請求後端接口進行測試時,往往需要先登錄,在 Apifox 中可以用“前置腳本”來完成登錄操作,每次發請求測試接口前,都先調用“前置腳本”完成登錄。

下面是一個例子(更多信息可參考登錄態(Auth)如何處理),代碼流程:

  1. 環境變量中獲取LOGIN_USERNAMELOGIN_PASSWORD變量的值(用戶名和密碼——需要自己先設置好)
  2. 請求後端接口獲取到公鑰
  3. 使用公鑰加密用戶名和密碼
  4. 使用加密後的用戶名和密碼請求後端登錄接口,獲得 Cookie 值
  5. 將 Cookie 值設置到請求頭中
  6. 之後發起請求時就會帶上 Cookie 值,後端就不會攔截請求
const username = pm.environment.get("LOGIN_USERNAME");
const password = pm.environment.get("LOGIN_PASSWORD");
login('session.id', 'ACCESS_TOKEN', username, password);

/**
 * 登錄並設置 Cookie 值
 * @param {String} cookieKey Cookie 名
 * @param {String} envName 用來保存 Cookie 值的全局變量名
 * @param {String} username 用戶名
 * @param {String} password 用戶密碼
 */
function login(cookieKey = 'token', envName = 'ACCESS_TOKEN', username, password) {
    const baseUrl = pm.request.getBaseUrl();
    const publicKeyRequest = {
        url: baseUrl + "/a/loginV2",
        method: "POST"
    };
    // pm.sendrequest 參考文檔:https://www.apifox.cn/help/app/scripts/api-references/pm-reference/#pm-sendrequest
    pm.sendRequest(publicKeyRequest, function(err, res) {
        if (err) {
            console.log(err);
        } else {
            const result = res.json();
            console.log(result);
            if (result.code == 200 && result.msg == '已登錄'){
                console.log('已登錄');
                pm.request.headers.upsert({ key: 'Cookie', value: cookieKey + '=' + pm.environment.get(envName)})
                return
            }
            if (result.code == 100) {
                const publicKey = result.data;

                const loginRequest = {
                    url: baseUrl + "/a/loginV2",
                    method: "POST",
                    body: {
                        mode: "urlencoded",
                        urlencoded: [
                            { key: "keyA", value: encrypt(username, publicKey) },
                            { key: "keyB", value: encrypt(password, publicKey) },
                        ],
                    }
                };

                pm.sendRequest(loginRequest, function(err, res) {
                    if (err) {
                        console.log(err)
                        return
                    }
                    // Cookies 參考文檔:https://www.apifox.cn/help/app/scripts/api-references/pm-reference/#pm-cookies
                    const result = res.json();
                    console.log(result);
                    if (result.code == 200 && result.msg == '已登錄'){
                        console.log('已登錄');
                        pm.request.headers.upsert({ key: 'Cookie', value: cookieKey + '=' + pm.environment.get(envName)})
                    } else {
                        console.log(envName, result.data);
                        pm.environment.set(envName, result.data);
                        // 參考:https://blog.csdn.net/m0_67401660/article/details/123419962
                        pm.request.headers.upsert({ key: 'Cookie', value: cookieKey + '=' + pm.environment.get(envName)})
                    }
                });
            }
        }
    });
}

/**
 * RSA 加密,參考:https://blog.csdn.net/m0_67401660/article/details/123419962
 * @param {String} encryptData 待加密值 
 * @param {String} publicKey 公鑰
 * @returns 加密後的值
 */
function encrypt(encryptData, publicKey) {
    const jsrsasign = require("jsrsasign");
    publicKey = "-----BEGIN PUBLIC KEY-----" + publicKey + "-----END PUBLIC KEY-----";
    const pub = jsrsasign.KEYUTIL.getKey(publicKey);
    const enc = jsrsasign.KJUR.crypto.Cipher.encrypt(encryptData, pub);
    return enc;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章