在 API 服务中使用令牌作为用户身份校验的凭证。Flask-HTTPAuth 为我们提供了不同类型的认证方法。
verify_token() 用于校验 Token,generate_token() 用户生成 Token
# lib/token.py
auth = HTTPTokenAuth(scheme='Token')
@auth.verify_token
def verify_token(token):
s = Serializer(
secret_key=current_app.config['SECRET_KEY'],
expires_in=current_app.config['EXPIRES_IN']
)
try:
data = s.loads(token)
except BadSignature:
raise TokenInvalid
except SignatureExpired:
raise TokenExpired
g.user_id = data['user_id']
return True
def generate_token(user_id):
s = Serializer(
secret_key=current_app.config['SECRET_KEY'],
expires_in=current_app.config['EXPIRES_IN']
)
token = s.dumps({
'user_id': user_id,
})
return token.decode('ascii')
使用时通过在请求方法上增加 @auth.login_required 注解即可
@api.route('', methods=['GET'])
@auth.login_required
def get_users():
"""
分页查询用户
"""
pagination = User.get_pagination().append('update_time', 'delete_time')
return Success(data=paginator_schema(pagination))
在项目部署后我们经常会收到许多来自不同国家流量的拜访,为了避免这种情况给我们带来不必要的麻烦,可以增加一个与前端约定好的请求头,来阻挡一部分流量,对其直接返回。
def register_request(app):
@app.before_request
def header_validator():
if 'APP_NAME' in app.config:
if 'X-App-Name' in request.headers:
if request.headers['X-App-Name'] != app.config['APP_NAME']:
raise HeaderInvalid
else:
raise HeaderInvalid
但最重要的还是开发和运维人员要有很强的安全意识才行。
前端调用时候需要填写上述的两个请求头:
X-App-Name: FLASK-TEA
Authorization: Token eyJhbGciOiJIUzUxMiIsImlhdCI6MTYxMzI3OTgzMywiZXhwIjoxNjEzODg0NjMzfQ.eyJ1c2VyX2lkIjoiNzZkMGUzMWQwOGJmNDFkZGEyYzRmYTc1Nzg4NjVlZGMifQ.Fls-CVfHRYKYae7cu01pBqTzZu9Zt6HGM_BQkXas5pMF039XhUwuWr6xlEd_vKVmhVEzUFFGfQgJ4tUnXCQ5Zw