tornado 使用jwt完成用户异步认证

2023-03-06 19:19:18 浏览数 (1)

# 简介

在使用特定功能时,需要验证用户是否登录。使用jwt将用户不敏感的信息保存在客户端上,然后访问时,将加密的信息发送给服务端验证。

和session的不同之处在于,session需要在两端都存储,而jwt仅在客户端存储。

该项目的github地址: tornado_learning.git (opens new window)

# 栗子

创建异步验证的装饰器

从header中获取tsessionid的jwt token信息,然后从token获取用户id,从数据库中查找用户信息,再验证token是否过期。

代码: utils/authenticated_async.py

代码语言:javascript复制
def authenticated_async(method):
    async def wrapper(self, *args, **kwargs):

        # ret_data = {}

        tsessionid = self.request.headers.get("tsessionid", None)
        if tsessionid:

            try:
                payload = jwt.decode(tsessionid, self.settings["secret_key"], leeway=self.settings["jwt_expire"],
                                     options={"verify_exp": True})

                user_id = payload["id"]
                try:
                    user = await self.application.objects.get(User, id=user_id)
                    self._current_user = user
                    await method(self, *args, **kwargs)
                except User.DoesNotExist as e:
                    self.set_status(401)
            except jwt.ExpiredSignatureError as e:
                self.set_status(401)

    return wrapper

在请求上添加用户认证

每次在请求该接口时,都需要对进行用户认证,认证通过才能访问该接口。

代码: apps/school/handle.py

代码语言:javascript复制
from utils.authenticated_async import authenticated_async

class StudentHandler(BaseHandler):

    @authenticated_async
    async def get(self):
        id = self.get_argument("id", None)
        if not id:
            return self.write("please provide the 'id'")

        student = await self.application.objects.get(Student, id=id)

        try:
            self.write({
                "id": student.id,
                "name": student.name
            })
        except Student.DoesNotExist:
            raise tornado.webHttpError(404, "Object not found")

0 人点赞