【问题标题】:Authentication for Flask-based API?基于 Flask 的 API 的身份验证?
【发布时间】:2017-08-31 10:03:06
【问题描述】:

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

【问题讨论】:

  • 我认为 Flask-OAuth 或 Flask-OAtuthlib 会有所帮助。

标签: python-3.x flask google-authentication


【解决方案1】:

我使用flask-login 来拦截带有会话的Web 请求和带有标头的Web 请求。来自网络的请求使用 Flask 的会话,来自移动应用程序的请求发送一个标头。

这些方法返回给定请求的用户。 API 令牌由为 Flask 的 cookie 提供支持的 itsdangerous 签名(防篡改)。

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)

此端点接受身份验证请求,检查用户名和密码并发出令牌。 itsdangerous 序列化程序会生成对象的防篡改版本。客户端提交与标头相同的内容。只要应用的密钥是安全的,您的服务器就可以确认签名对象是由您的服务器颁发的。

@blueprint.route('/api_auth', methods=["post"])
def api_auth():
   ...check username and password
    return response({
        'API-TOKEN': serializer.dumps({'id': user.id})
    })

【讨论】:

  • 谢谢!不过,您似乎使用的是本地用户模型——我想知道是否有人在使用 3rd-party 身份验证系统时实现了类似的东西。
  • 用户“model”没有理由应该在某个数据库中。 Flask-login 可以使用 API 进行登录操作。
猜你喜欢
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
相关资源
最近更新 更多