柚子快報(bào)激活碼778899分享:爬蟲(三)突破JWT認(rèn)證
柚子快報(bào)激活碼778899分享:爬蟲(三)突破JWT認(rèn)證
JWT認(rèn)證
一、工作原理
鑒權(quán)原理和cookie、session認(rèn)證差不多,不多說直接上圖
token一般分為三部分:頭部、載體、簽名
二、具體案例
1.1 、以新版電子稅務(wù)局為例,rpa在拿到稅務(wù)數(shù)字賬戶cookie后,驗(yàn)證cooke有效性的過程中,發(fā)現(xiàn)無法喚醒新開的瀏覽器(表象:頁面空白)
正常頁面: cookie初次喚醒頁面(非必現(xiàn)): 在此之前,其實(shí)我并不知道JWT這個(gè)概念,但是大概知道應(yīng)該是鑒權(quán)沒通過的導(dǎo)致的,并且看到頁面報(bào)錯(cuò)
1.2、比對(duì)正常rpa登錄、cookie登錄頁面參數(shù) ,觀察發(fā)現(xiàn)有個(gè)區(qū)別,就是在cookie登錄時(shí),凡是跳轉(zhuǎn)后頁面空白的情況,大概率這個(gè)字段的值都是空的
初步斷定這個(gè)字段應(yīng)該是服務(wù)端生成的,這就是問題所在,嘗試將rpa登錄后中的token保存下來,再塞到cookie登錄的環(huán)節(jié)中,刷新頁面發(fā)現(xiàn)是可以的,大功告成。
1.3、關(guān)鍵模塊實(shí)現(xiàn)
/**
* 獲取上傳token
*/
async upload_token() {
var token_data = await this.page.evaluate(() => {
const token_data = {};
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
token_data[key] = localStorage.getItem(key);
}
return token_data
});
fs.writeFileSync("token.json", JSON.stringify(token_data))
console.log("------token上傳成功------")
}
/**
* cookie登錄
*/
async cookie_login() {
console.log("------開始cookie登錄------")
await this.access_login_page();
await this.page.deleteCookie();
// 添加cookie
await this.page.setCookie(cookies_array.at(0), cookies_array.at(1));
await this.page.goto(cfg.login_page_url);
await this.sleep(1000 * 10)
for (var i = 0; i < 3; i++) {
if (await this.page.$(cfg.top_navigtor_locator)) {
break
}
console.log("第%d次嘗試刷新頁面", i)
// 添加token
await this.page.evaluate((key, value) => {
localStorage.setItem(key, value);
}, "dunm_data", cookies_array.at(2)["dunm_data"])
await this.page.reload()
await this.sleep(1000 * 5)
}
}
篇外話:入職新公司一周多了,上面是剛做的就隨手記錄下,平常主要用nodejs的puppeteer做爬蟲,然后還會(huì)有接口的開發(fā),涉及koa框架的使用,其他的,怎么說呢,之前沒接觸過先學(xué)完…
柚子快報(bào)激活碼778899分享:爬蟲(三)突破JWT認(rèn)證
好文閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。