python+flask_restful使用jwt

正在做毕设,由于毕设需求使用python+flask,使用jwt目的是对请求进行保护,我的项目采用vue3+flask前后端分离实现,进入正题:

使用jwt,首先下载扩展

pip install Flask-JWT-Extended

然后在项目中注册使用,我的项目结构是这样的

 在exts.py中引入jwt扩展,

from flask_jwt_extended import create_access_token,get_jwt_identity,jwt_required,JWTManager

jwt = JWTManager()


def init_ext(app):
    jwt.init_app(app)

在__init__.py中设置密钥

app.config["JWT_SECRET_KEY"] = "super-secret"
# 初始化插件扩展
init_ext(app)

apis.py 中用来写方法,urls中用来写路由,方便前端使用

apis.py中的登录

class Login(Resource):
    @marshal_with(login_fields)
    def post(self):
        data = request.get_json()
        email = data.get('email')
        password = data.get('password')
        u = User.query.filter_by(email=email).first()
        access_token = create_access_token(identity=email)
        if password == u.password:
            return {
                "code":200,
                "msg":"success",
                "data":u,
                "token":access_token #登录成功会返回token
            }
        else:
            return {
                "code":201,
                "msg":"fail"
            }

使用ApiPost进行测试

 完成之后,在另一请求上获取token,参数名为Authorization

class UserResource(Resource):
    method_decorators = [jwt_required()]
    @marshal_with(res_fields)
    def get(self):
        current_user = get_jwt_identity()
        if current_user is None:
            return jsonify("Not Authorized"),401
        curr_page = int(request.args.get('curr_page', 1))
        page_size = int(request.args.get('page_size', 5))
        name = request.args.get('name',None)
        p = User.query.filter(User.name.like('%' + name + '%')).paginate(page=curr_page, per_page=page_size)
        return {
            'code': 200,
            'msg': 'success',
            'data': p.items,
            'curr_page': p.page,
            'page_size': p.per_page,
            'total': p.total
        }

再次进行测试,

不携带token会出现

携带token会出现 

 

 这时需要在Authorization的参数值前方加入"Bearer "

 参考文章:flask实战

 

posted on 2024-01-20 17:51  跨越&尘世  阅读(116)  评论(0编辑  收藏  举报