基于Flask的API的身份验证?
问题描述:
我已经通过Flask视图构建了一个API,用户使用一些端点在/api/v1/....
处访问。我想认证提出请求的用户。什么是强制使用我的API进行身份验证的方法?有没有办法避免构建用户模型,而是使用Google或基于Github的身份验证?基于Flask的API的身份验证?
答
我使用flask-login拦截具有会话的Web请求和具有标题的Web请求。来自Web的请求使用Flask的会话,来自移动应用程序的请求会发送一个标题。
这些方法返回给定请求的用户。 API token由其危险签名(防篡改),从而为Flask的cookies提供支持。
from itsdangerous import URLSafeSerializer, BadData
serializer = URLSafeSerializer(CONFIG['SECRET_KEY'])
def load_user_from_request(request):
token = request.headers.get('API-TOKEN')
if token:
try:
user_id = serializer.loads(token)["id"]
user = User.query.filter(User.active == True, User.id == int(user_id)).first()
if user:
return user
except BadData as e:
pass
return None
def load_user(id):
user = User.query.filter(User.active == True, User.id == int(id)).first()
if not user:
return None
return user
login_manager.user_loader(load_user)
login_manager.request_loader(load_user_from_request)
该端点接受认证请求,检查用户名和密码并发出令牌。其危险的串行器使您的对象的防篡改版本。客户端提交相同的标题。只要应用程序的密钥安全,您的服务器就可以确认已签名的对象是由您的服务器发出的。
@blueprint.route('/api_auth', methods=["post"])
def api_auth():
...check username and password
return response({
'API-TOKEN': serializer.dumps({'id': user.id})
})
我认为Flask-OAuth或Flask-OAtuthlib会有帮助。 – stamaimer