使用flask-httpauth给你的flask-restful-api加入请求认证
最近在用vue.js
和flask-restful
开发一个前后端分离的个人博客,其中有一个接口article
用于根据文章ID对文章进行查询(get请求)、修改(post请求)等操作。显然这个接口只有查询操作能对所有用户开放而修改操作只对管理员开放。这时候就需要对aritcle
接口进行请求认证,由于Restful api并不保存状态,因此也就无法使用Flask-login依赖Cookie以及session来实现认证。所有这里我使用了另一个扩展Flask-HTTPAuth
1. 重写前的接口
先来看一下重写前的接口下面是一个demo。article
接口支持get、post
请求,分别用于查询文章信息和修改文章信息,
用列表来存储文章数据
使用列表嵌套字典的形式,存储两个文章,每个文章包含了两个字段id
用于查询文章和content
存储文章的内容。
1 | from flask_restful import reqparse, Resource |
使用flask-restful编写article接口
使用flask-restful
编写article接口,接受两种请求get
和post
,分别用于查询文章和修改文章
1 | class Article(Resource): |
2. 使用flask-httpauth添加请求认证
我们不希望article
这个接口的post
请求对任何人都开放。通过引入flask-httpauth
对article
接口的post
请求加入请求认证。Flask-HTTPAuth是一个简单的扩展,它简化了HTTP身份验证与Flask路由的使用。其提供了多种不同的Auth方法,比如HTTPBasicAuth,HTTPTokenAuth,MultiAuth和HTTPDigestAuth。这个例子中我们使用基本的密码验证,同时
2.1 安装flask-httpauth
在你的终端窗口执行:
1 | pip install Flask-HTTPAuth |
创建flask-httpauth
对象实象。需要注意,初始化实例时不需要传入app对象,也不需要调用auth.init_app(app)
注入应用对象。
1 | from flask import Flask |
2.2 使用HTTPBasicAuth
使用我们先简单的使用HTTPBasicAuth
进行用户和密码认证。创建HTTPBasicAuth
实例对象。为了方便演示,我们把用户名和密码存入一个字典里面。
1 | auth_basic = HTTPBasicAuth() |
2.2.1 对article
接口添加请求认证
@auth_basic.login_required
装饰器表示视图需要认证,在flask-restful
编写的api中我们需要的在接口中添加类变量method_decorators
。其值是一个字典形式。下面的代码表示Article
接口的post和delete请求需要认证。
1 | class Article(Resource): |
2.2.2 编写验证用户密码的回调函数
@auth_basic.verify_password
装饰器用于验证用户名和密码。在它所修饰的函数里面返回True或者是False.
1 |
|
2.2.3 对接口进行测试
使用curl命令对接口进行测试, 会得到Unauthorized Access
表示没有权限。
1 | curl -d "id=1&content=modify article1" -X POST http://127.0.0.1:5000/article |
加入用户名和密码后则可以正常修改文章。
1 | curl -u admin:123456 -d "id=1&content=modify article1" -X POST http://127.0.0.1:5000/article |
2.2.4 错误处理
在之前的例子中,如果未认证成功,服务端会返回401状态码及”Unauthorized Access”文本信息。可以通过重写错误处理方法,自定义返回的错误信息。用@auth_basic.error_handler
装饰器来修饰错误处理方法:
1 | from flask import make_response, jsonify |
加入这个错误处理方法后,认证失败后服务器会返回JSON信息{res:0,message:Unauthorized access}
.
2.2.5 使用Flask-Bcrypt
在大多数情况下,数据库中的密码是以非明文的形式存储的。可以使用Flask-Bcrypt
扩展对密码进行哈希后再存储到数据库中。官方文档在这里。
2.3 使用 HTTPTokenAuth
大部分情况下我们并不是使用密码和用户名进行验证的,而是使用token
来做验证。Flask-HTTPAuth
中的HTTPTokenAuth
可以完成token
验证。与HTTPBasicAuth
相似,它也提供了login_required
装饰器来认证视图函数,error_handler
装饰器来处理错误。不同的是它没有verify_password
装饰器取而代之的是verify_token
。在这里我是使用一个login
接口用于登录操作,登录之后将会使用用户名和密码生成一个token,存储在flask的全局变量g中,以供token
验证时调用。具体代码等有时间在写吧。。。
未完。。。
使用flask-httpauth给你的flask-restful-api加入请求认证