1 介绍
在实际项目中,如果直接将api接口暴露给外网一方面容易引起信息泄露,另一方面会触发公司系统漏洞;因此,实际项目中应该给api接口设置一个基础的auth。既可以使用 BasicAuth,也可以使用OpenId, 或者其它专有的auth认证方式。
本文介绍一种基于 USERNAME 和 PASSWORD 的简单认证,即 BasicAuth。
2 源码
前置条件:
pip install Flask-BasicAuth flask
server 源码:
from flask import Flask
from flask_basicauth import BasicAuth
app = Flask(__name__)
app.config['BASIC_AUTH_USERNAME'] = 'admin'
app.config['BASIC_AUTH_PASSWORD'] = '111111'
app.config['BASIC_AUTH_FORCE'] = True
#basic_auth = BasicAuth(app)
@app.route('/')
def hello_root():
print('v1.2 Hello Root!\n')
return 'v1.2 Hello Root!\n'
@app.route('/hello')
def hello_world():
print('v1.2 Hello World!\n')
return 'v1.2 Hello World!\n'
if __name__ == '__main__':
app.run(host='0.0.0.0',port=8080)
client 源码:
import json
import requests
def test():
response = requests.get(
"http://127.0.0.1:8080/hello",
json={},
auth=('admin', '111111'))
print(response.text)
if __name__ =="__main__":
test()
测试:
首次登陆的时候会出现类似下面输入用户名和密码的界面,输入后即可正常访问api 返回信息了。
server 端日志:
browser 端返回:
3 注意事项
- BasicAuth 也是一种简单认证,安全等级不高,实际项目中建议不要使用 admin、123456 等简单的用户名和密码,以防被暴力破解。
- 截止20210915,设置app.config[‘BASIC_AUTH_FORCE’] = True 后默认并没有对所有api加认证
最近发现配置了BASIC_AUTH_FORCE 后实际没有生效,可能是最新版本api有变动(笔者还未验证), 因此可以通过 @basic_auth.required 来对指定的api 加认证,具体案例如下app = Flask(__name__) app.config['BASIC_AUTH_USERNAME'] = 'admin' app.config['BASIC_AUTH_PASSWORD'] = '111111' app.config['BASIC_AUTH_FORCE'] = True basic_auth = BasicAuth(app) @app.route('/') @basic_auth.required def help(): return "hello, help docs"
- 使用basic-auth后, 如果使用postman|postwoman 测试,那么需要在header中添加 username 和 password 字段。