Nodejs 後端解HTTP basic auth認證

項目中一般用oauth2 認證,今天想寫一個demo就在POSTMAN中填了簡單認證方式。嗯… 發現在express 還沒有解過 尷尬了…今天寫這篇blog把這個知識點加入到菜譜。


1 Basic auth認證

看到這種標準協議呀,第一反應是肯定有很難看RFC 標準文檔,在MDN網站上找到HTTP Authentication機制的文檔:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Authentication

1.1 通用的 HTTP 認證框架

RFC 7235 定義了一個 HTTP 身份驗證框架,服務器可以用來針對客戶端的請求發送 challenge (質詢信息),客戶端則可以用來提供身份驗證憑證。質詢與應答的工作流程如下:服務器端向客戶端返回 401(Unauthorized,未被授權的) 狀態碼,並在 WWW-Authenticate 首部提供如何進行驗證的信息,其中至少包含有一種質詢方式。之後有意向證明自己身份的客戶端可以在新的請求中添加 Authorization 首部字段進行驗證,字段值爲身份驗證憑證信息。通常客戶端會彈出一個密碼框讓用戶填寫,然後發送包含有恰當的 Authorization 首部的請求。

在上圖所示的基本身份驗證過程中,信息交換須通過 HTTPS(TLS) 連接來保證安全。 HTTPs是必須的否則抓包就完蛋。

1.2 基本驗證方案(Basic auth)

“Basic” HTTP 驗證方案是在 RFC 7617中規定的,在該方案中,使用用戶的 ID/密碼作爲憑證信息,並且使用 base64 算法進行編碼。

簡單來說 就是HTTP headers中 增加了一個字段,如下(這個是POSTMAN生成的)
Authorization: Basic cG9zdG1haWxAdGVzdC5jb206MTIzNDU2Nzg=
其中basic 後面的字段即爲 用戶ID:密碼 base64編碼後的值
**
因爲base64編碼可逆,基本上談不上安全。所以必須搭配TLS使用。

自己手寫一把上面POSTMAN Basic auth生成代碼,實質上就是對 id:password 進行base64編碼
id:[email protected]
密碼:12345678

let email = "[email protected]"
let password = "12345678"
let auth = `${email}:${password}`
const buf = Buffer.from(auth, 'ascii');
console.info(buf.toString('base64'));
cG9zdG1haWxAdGVzdC5jb206MTIzNDU2Nzg=

結果一樣符合預期

2 nodejs服務端中解Basic auth認證

2.1 basic-auth模塊

如果在express 這種框架中使用可以直接引用 const basicAuth = require(‘basic-auth’) 模塊。
調用即可拿到想要的值: const credentials = basicAuth(req);

const basicAuth = require('basic-auth')

app.post('/token', (req, res) => {
  console.info(req.headers.authorization);
  const credentials = basicAuth(req);
  console.info(credentials);

  res.end();
});
//Basic cG9zdG1haWxAdGVzdC5jb206MTIzNDU2Nzg=
//Credentials {name: "[email protected]", pass: "12345678"}

2.2 自行解析

這個邏輯很簡單也可以隨手解開

  console.info(req.headers.authorization);
  const buf = Buffer.from(req.headers.authorization.substring(req.headers.authorization.indexOf(' ')+1), 'base64');
  const authString = buf.toString('ascii');
  const basicauth = authString.split(':');
  console.info(basicauth);
//Basic cG9zdG1haWxAdGVzdC5jb206MTIzNDU2Nzg=
//Array(2) ["[email protected]", "12345678"]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章