為什麼要用token?
對於傳統的session,客戶端做一次記錄,以方便使用者下次請求的鑑別,通常而言session都是儲存在記憶體中,而隨著認證使用者的增多,服務端的開銷會明顯增大。
傳統session儲存的擴充套件性差,服務端做認證記錄,如果認證的記錄被儲存在記憶體中的話,這意味著使用者下次請求還必須要請求在這台伺服器上,這樣才能拿到授權的資源,這樣在分布式的應用上,相應的限制了負載均衡器的能力。這也意味著限制了應用的擴充套件能力。
傳統session的安全性差, cookie如果被截獲,使用者就會很容易受到跨站請求偽造的攻擊(csrf)
token
基於token的鑑權機制類似於http協議是無狀態的,它不需要在服務端去保留使用者的認證資訊或者會話資訊。這就意味著基於token認證機制的應用不需要去考慮使用者在哪一台伺服器登入了,這就為應用的擴充套件提供了便利。
流程上是這樣的:
這個token必須要在每次請求時傳遞給服務端,它應該儲存在請求頭里, 另外,服務端要支援cors(跨**資源共享)
策略,一般我們在服務端這麼做就可以了access-control-allow-origin: *
。
乙個token由三部分組成。
第一部分我們稱它為頭部(header),第二部分我們稱其為載荷(payload, 類似於飛機上承載的物品),第三部分是簽證(signature).
express中jwt的定義方式:
在使用者驗證的檔案中,頒發jwt,設定規則,私鑰和有效期:jwt規定token前要加bearer標註
const rule = ;驗證jwtconst key = keys.secretorkey;
jwt.sign(rule,key,,(err,token)=>)
}).catch(err => );
伺服器檔案中初始化passport,並將其作為引數傳入passport的配置目錄
在passport的配置檔案中配置token驗證的方式為jwt驗證
const jwtstrategy = require("passport-jwt").strategy,在使用者管理檔案中引入配置好的passportextractjwt = require("passport-jwt").extractjwt;
// 讀取資料庫以便後面驗證是否有相應userid對應的token
const mongoose = require("mongoose");
const user = mongoose.model("users");
const keys = require("../config/keys");
const opts = {};
// 配置passport支援jwt
opts.jwtfromrequest = extractjwt.fromauthheaderasbearertoken();
opts.secretorkey = keys.secretorkey;
// 匯出passport-jwt
module.exports = (passport) => , (err, user) =>
if (user) else
});})
);};
// 檢測登入狀態// $route get api/users/current
// @desc 返回當前登入的使用者
// @access private
// 位址 驗證token **函式
router.get("/current",passport.authenticate('jwt',),
(req,res)=>);
});
nodeJS裡面的模組化
開啟cmd,執行如下命令 輸出如上資訊,表示this是global,每個電腦的配置資訊不一樣的話,可能會有所差別的。然後新建乙個檔案,寫下如下 console.log this 使用node命名執行你的檔案,發現會輸出 this表示你當前操作的模組 然後新建乙個檔案,寫下如下 console.log...
關於channel裡面的策略
關於channel裡面的策略 channel裡面的配置主要在data.data 0 pyload.data.config裡面。config是由groups遞迴形成的。groups的結構如下 groups 下一層 mod policy 當前層發生改變時,需要執行的策略名稱 policies 當前層策略...
關於爬蟲裡面的Cookie
把cookie放到headers中直接登入獲取資料 把cookie單獨拿出來利用字串切割轉換成字典然後放到請求的url中進行請求響應獲取引數 cookie dict requests.get url,headers headers headers,cookies cookie dict a b if...