基于Flask的API的身份验证?

问题描述:

我已经通过Flask视图构建了一个API,用户使用一些端点在/api/v1/....处访问。我想认证提出请求的用户。什么是强制使用我的API进行身份验证的方法?有没有办法避免构建用户模型,而是使用Google或基于Github的身份验证?基于Flask的API的身份验证?

+1

我认为Flask-OAuth或Flask-OAtuthlib会有帮助。 – stamaimer

我使用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}) 
    }) 
+0

谢谢!看起来您使用的是本地用户模式 ​​- 但我想知道是否有人在使用第三方认证系统时执行了类似的操作。 – orange1

+0

没有理由为什么用户“模型”应该在某些数据库中。 Flask-login可以使用API​​来登录。 – aitchnyu