为无登陆鉴权功能的接口与网站添加登陆鉴权功能
1. 缘由
本人部分服务的测试接口为方便日常测试调试,使用了 ip+端口 的形式进行访问,并且未配置账号密码鉴权机制。在日常测试一段时间后,终于还是收到了来自腾讯云的监管通知,说服务存在数据泄露的风险,需要进行整改,否则将强行关停服务。
于是,本人认真思考本问题、查找相关资料并结合本人的web服务实际情况,决定使用 HTTP Basic Auth
技术并结合 NGINX
反向代理来完成接口鉴权的操作。
2. HTTP Basic Auth
2.1 什么是 HTTP Basic Auth ?
HTTP 提供一个用于权限控制和认证的通用框架:基本认证(Basic access authentication),其是一种用来允许网页浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。
优点:
- 操作简单
- 所有流行的网页浏览器都支持基本认证
缺点:
- 认证信息仅仅使用Base64进行编码,并未使用加密算法
- 无法防止中间人攻击,中间人可已修改报文然后请求服务器
2.2 为接口添加 HTTP Basic Auth 鉴权
原理:本人使用 NGINX
反向代理访问接口数据服务器,并在 NGINX
反向代理配置文件中添加 Basic Auth 鉴权功能,
2.2.1 创建反向代理网站
在反向代理服务器中使用宝塔面板创建一个网站,并将域名(或任使用ip+port)解析到该网站。
2.2.2 安装 htpasswd 并生成鉴权账号和密码
- 首先安装 htpasswd 服务
sudo apt-get install httpd-tools
- htpasswd是开源的http服务器Apache Http Server的一个命令行工具,可以用来创建和更新基本认证的用户认证密码文件。
- 参数
-b —>密码直接写在命令行中,而非使用提示输入的方式
-c —>创建密码文件,如果文件存在,则覆盖
-n —>不更新密码文件,将用户名密码进行标注输出
-m —>使用md5算法对密码处理
-d —>使用crypt算法对面处理
-s —>使用sha算法对密码处理
-p —>不对密码加密处理,使用明文
-D —>从密码文件中删除指定用户记录
- 生成鉴权的账号密码文件
在指定目录下生成鉴权的账号密码文件,该目录文件普通用户需要可以访问并读写。
htpasswd -bc /usr/local/myPasswd/nginxpasswd test 123123
2.2.3 配置反向代理与鉴权认证
在刚刚创建的反向代理网站的配置文件中添加以下内容:
location / {
# 设置跨域相关配置
add_header 'Access-Control-Allow-Origin''*';
add_header 'Access-Control-Allow-Methods''*';
add_header 'Access-Control-Allow-Headers''*';
if ($request_method = 'OPTIONS') {
return 204;
}
# 设置鉴权相关配置
# 帐号认证弹框的banner信息,说明服务名称
auth_basic "请输出账号密码:";
# 认证的帐号密码文件,也就是我们上面使用 htpasswd 创建的密码文件
auth_basic_user_file /usr/local/myPasswd/nginxpasswd;
# 设置反向代理相关配置
# 配置需要被反向代理的数据接口服务器的 ip+端口
proxy_pass http: //127.0.0.1:12345;
}
然后通过反向代理服务器配置的域名访问网站,会弹出输入用户名和密码的弹框:
2.2.4 通过 ajax 请求 api 形式访问
添加了 Basic Auth 鉴权的接口在使用 ajax 请求时需要在 headers 头部增加 Authorization
字段,并包含鉴权的用户名和密码,否则报错401。
例如使用 axios 发送请求:
axios.post(url,{headers:{'Authorization': 'Basic ' + base64encode(username+":"+password)})
至此 HTTP Basic Auth 的配置教程已全部结束。
参考文档:
本文首发于本人博客:https://blog.gitnote.cn/post/http_basic_auth
版权信息: CC BY-NC-SA 4.0 (自由转载-非商用-相同方式共享-保持署名)