Basic认证原理
1 Basic auth认证
看到这种标准协议呀,第一反应是肯定有很难看RFC 标准文档,在MDN网站上找到HTTP 机制的文档:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Authentication
1.1 HTTP 认证方式
“Basic” HTTP 验证方案是在 RFC 7617中规定的,使用用户的 ID/密码作为凭证信息,并且使用 base64 算法进行编码。
简单来说,就是在http请求头中增加Authorization的Basic认证字段;
其中basic 后面的字段即为 用户ID:密码 base64编码后的值
以
-
-
password:public
为例进行认证:
GET http://192.168.0.105:8081/api/v4 HTTP/1.1 Authorization:Basic YWRtaW46cHVibGlj
其中,YWRtaW46cHVibGlj就是admin:password编码后的字符串
1.2 如何计算Base64编码
let email = "admin"
let password = "public"
let auth = `${email}:${password}`
const buf = Buffer.from(auth, 'ascii');
console.info(buf.toString('base64'));
//输出信息
YWRtaW46cHVibGlj
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 YWRtaW46cHVibGlj
//Credentials {name: "admin", pass: "public"}
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 YWRtaW46cHVibGlj
//Array(2) ["admin", "public"]