Nodejs 后端解HTTP basic auth认证

项目中一般用oauth2 认证,今天想写一个demo就在POSTMAN中填了简单认证方式。嗯… 发现在express 还没有解过 尴尬了…今天写这篇blog把这个知识点加入到菜谱。

文章目录

  • 1 Basic auth认证
    • 1.1 通用的 HTTP 认证框架
    • 1.2 基本验证方案(Basic auth)
  • 2 nodejs服务端中解Basic auth认证
    • 2.1 basic-auth模块
    • 2.2 自行解析

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 首部的请求。
Nodejs 后端解HTTP basic auth认证_第1张图片
在上图所示的基本身份验证过程中,信息交换须通过 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"]

你可能感兴趣的:(nodejs,javascript)