Flask-HTTPAuth

说明

  • 是一个专门用来身份认证的扩展库,使用非常方便

安装

  • pip install flask-httpauth

文档

基本认证

from flask import Flask, jsonify
from flask_script import Manager
from flask_restplus import Api, Resource
from flask_httpauth import HTTPBasicAuth

# 创建认证对象
auth = HTTPBasicAuth()

# 认证回调函数:返回True表示认证成功,返回False表示认证失败
@auth.verify_password
def verify_password(username, password):
    if username == 'Jerry' and password == '123456':
        return True
    return False

# 定制认证错误
@auth.error_handler
def unauthorized():
    return jsonify({'error': 'Unauthorized Access'}), 403

app = Flask(__name__)
manager = Manager(app)
# 创建接口对象
api = Api(app)

# 使用装饰器将资源添加到接口:可以指定多个路由
@api.route('/users/<int:uid>', '/u/<int:uid>')
# 创建资源类:必须继承自Resource
class UserAPI(Resource):
    # 保护当前资源类的所有方法
    method_decorators = [auth.login_required]

    def get(self, uid):
        # 返回字典对象:扩展会自动将其转换为JSON数据
        return {'UserAPI': 'GET'}, 200

    def put(self, uid):
        return {'UserAPI': 'PUT'}

    def delete(self, uid):
        return {'UserAPI': 'DELETE'}

# 一个完整的资源通常有两个资源类完成
class UserListAPI(Resource):
    # 保护指定操作:只有认证成功才可访问
    @auth.login_required
    def get(self):
        return {'UserListAPI': 'GET'}

    def post(self):
        return {'UserListAPI': 'POST'}

# 使用专门的函数将资源类添加到接口:可以指定多个路由
api.add_resource(UserListAPI, '/users/', '/u/')

@app.route('/')
def index():
    return 'basic auth'

if __name__ == '__main__':
    manager.run()

Token认证

from flask import Flask, jsonify, request, g
from flask_script import Manager
from flask_restplus import Api, Resource
from flask_httpauth import HTTPTokenAuth
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer

# 创建认证对象
auth = HTTPTokenAuth(scheme='Token')

# 认证回调函数:返回True表示认证成功,返回False表示认证失败
# 请求头携带 Authorization: Token access_token
@auth.verify_token
def verify_token(token):
    # print(token)
    s = Serializer(app.config['SECRET_KEY'])
    try:
        # 会得到加密之前的数据(一个字典)
        data = s.loads(token.encode('utf8'))
        # print(data)
        # 将有效数据保存到当前请求的全局对象中
        g.data = data
        return True
    except:
        return False

# 定制认证错误
@auth.error_handler
def unauthorized():
    return jsonify({'error': 'Unauthorized Access'}), 403

app = Flask(__name__)
app.config['SECRET_KEY'] = '123456'
manager = Manager(app)
# 创建接口对象
api = Api(app)

# 使用装饰器将资源添加到接口:可以指定多个路由
@api.route('/users/<int:uid>', '/u/<int:uid>')
# 创建资源类:必须继承自Resource
class UserAPI(Resource):
    # 保护当前资源类的所有方法
    method_decorators = [auth.login_required]

    def get(self, uid):
        print(g.data)
        # 返回字典对象:扩展会自动将其转换为JSON数据
        return {'UserAPI': 'GET'}, 200

    def put(self, uid):
        return {'UserAPI': 'PUT'}

    def delete(self, uid):
        return {'UserAPI': 'DELETE'}

# 一个完整的资源通常有两个资源类完成
class UserListAPI(Resource):
    # 保护指定操作:只有认证成功才可访问
    @auth.login_required
    def get(self):
        return {'UserListAPI': 'GET'}

    def post(self):
        return {'UserListAPI': 'POST'}

# 使用专门的函数将资源类添加到接口:可以指定多个路由
api.add_resource(UserListAPI, '/users/', '/u/')

@app.route('/')
def index():
    return 'basic auth'

# 专门用来获取Token
@app.route('/get_token/', methods=['POST'])
def get_token():
    username = request.json['username']
    password = request.json['password']
    # 此处需要进行身份校验
    s = Serializer(app.config['SECRET_KEY'], expires_in=3600)
    token = s.dumps({'username': username})
    # print(token)
    return jsonify({'access_token': token.decode('utf8')})

if __name__ == '__main__':
    manager.run()

results matching ""

    No results matching ""