Flask-HTTPAuth
说明
- 是一个专门用来身份认证的扩展库,使用非常方便
安装
pip install flask-httpauth
文档
基本认证
from flask import Flask, jsonify
from flask_script import Manager
from flask_restplus import Api, Resource
from flask_httpauth import HTTPBasicAuth
# 创建认证对象
auth = HTTPBasicAuth()
# 认证回调函数:返回True表示认证成功,返回False表示认证失败
@auth.verify_password
def verify_password(username, password):
if username == 'Jerry' and password == '123456':
return True
return False
# 定制认证错误
@auth.error_handler
def unauthorized():
return jsonify({'error': 'Unauthorized Access'}), 403
app = Flask(__name__)
manager = Manager(app)
# 创建接口对象
api = Api(app)
# 使用装饰器将资源添加到接口:可以指定多个路由
@api.route('/users/<int:uid>', '/u/<int:uid>')
# 创建资源类:必须继承自Resource
class UserAPI(Resource):
# 保护当前资源类的所有方法
method_decorators = [auth.login_required]
def get(self, uid):
# 返回字典对象:扩展会自动将其转换为JSON数据
return {'UserAPI': 'GET'}, 200
def put(self, uid):
return {'UserAPI': 'PUT'}
def delete(self, uid):
return {'UserAPI': 'DELETE'}
# 一个完整的资源通常有两个资源类完成
class UserListAPI(Resource):
# 保护指定操作:只有认证成功才可访问
@auth.login_required
def get(self):
return {'UserListAPI': 'GET'}
def post(self):
return {'UserListAPI': 'POST'}
# 使用专门的函数将资源类添加到接口:可以指定多个路由
api.add_resource(UserListAPI, '/users/', '/u/')
@app.route('/')
def index():
return 'basic auth'
if __name__ == '__main__':
manager.run()
Token认证
from flask import Flask, jsonify, request, g
from flask_script import Manager
from flask_restplus import Api, Resource
from flask_httpauth import HTTPTokenAuth
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
# 创建认证对象
auth = HTTPTokenAuth(scheme='Token')
# 认证回调函数:返回True表示认证成功,返回False表示认证失败
# 请求头携带 Authorization: Token access_token
@auth.verify_token
def verify_token(token):
# print(token)
s = Serializer(app.config['SECRET_KEY'])
try:
# 会得到加密之前的数据(一个字典)
data = s.loads(token.encode('utf8'))
# print(data)
# 将有效数据保存到当前请求的全局对象中
g.data = data
return True
except:
return False
# 定制认证错误
@auth.error_handler
def unauthorized():
return jsonify({'error': 'Unauthorized Access'}), 403
app = Flask(__name__)
app.config['SECRET_KEY'] = '123456'
manager = Manager(app)
# 创建接口对象
api = Api(app)
# 使用装饰器将资源添加到接口:可以指定多个路由
@api.route('/users/<int:uid>', '/u/<int:uid>')
# 创建资源类:必须继承自Resource
class UserAPI(Resource):
# 保护当前资源类的所有方法
method_decorators = [auth.login_required]
def get(self, uid):
print(g.data)
# 返回字典对象:扩展会自动将其转换为JSON数据
return {'UserAPI': 'GET'}, 200
def put(self, uid):
return {'UserAPI': 'PUT'}
def delete(self, uid):
return {'UserAPI': 'DELETE'}
# 一个完整的资源通常有两个资源类完成
class UserListAPI(Resource):
# 保护指定操作:只有认证成功才可访问
@auth.login_required
def get(self):
return {'UserListAPI': 'GET'}
def post(self):
return {'UserListAPI': 'POST'}
# 使用专门的函数将资源类添加到接口:可以指定多个路由
api.add_resource(UserListAPI, '/users/', '/u/')
@app.route('/')
def index():
return 'basic auth'
# 专门用来获取Token
@app.route('/get_token/', methods=['POST'])
def get_token():
username = request.json['username']
password = request.json['password']
# 此处需要进行身份校验
s = Serializer(app.config['SECRET_KEY'], expires_in=3600)
token = s.dumps({'username': username})
# print(token)
return jsonify({'access_token': token.decode('utf8')})
if __name__ == '__main__':
manager.run()