如何写个在odoo里写个手机验证码快速登陆页面接口,有jwt加密,限制正常登陆时长(python)

JWT (JSON Web Token) 是一种开放标准(RFC 7519),用于在网络应用程序中安全地表示声明。它是一个经过数字签名的 JSON 对象,可以包含一些实体(如用户)的身份验证和授权数据。JWT 通常用于在客户端和服务器之间传输身份验证和授权信息,并可用于以安全的方式进行单点登录(SSO)。

JWT 的主要特点包括:

  1. 可扩展: JWT 可以包含任意的 JSON 数据,因此可以很容易地扩展来满足不同的需求。

  2. 紧凑: JWT 的数据以 Base64 编码,因此非常紧凑,适合在 URL、HTTP Header 和 HTTP POST 参数中传输。

  3. 自包含: JWT 包含了所有必要的信息,减少了额外的数据库查询。

  4. 可验证: JWT 可以使用数字签名进行验证,确保数据的完整性和发送者的身份。

总的来说,JWT 提供了一种安全、可扩展、轻量级的方式在客户端和服务器之间传输身份验证和授权信息。它广泛应用于现代 Web 应用程序和 API 认证中。

class RestfulAPIController(http.Controller):

    @http.route(['/quick_login'], type="json", auth="none", methods=['POST'], cors='*', csrf=False)
    def quick_login(self, **kwargs):
        values = {'success': True, 'code': 200, 'message': '', 'key': '', 'vip': '','token':''}
        mobile = str(kwargs.get("mobile"))
        captcha = str(kwargs.get("captcha"))
        tk = str(kwargs.get("token"))
        current_time = datetime.datetime.now().timestamp()
        print(current_time)
        if tk:
            # 验证和解析 JWT token
            decoded_jwt = jwt.decode(tk, '???', algorithms=['HS256'])

            # 提取负载中的内容
            sub = decoded_jwt['sub']
            expiresAt = decoded_jwt['exp']
            cap = decoded_jwt['cap']

            customer = request.env['tutor.customer'].sudo().search([('phone', '=', sub), ('state', '=', 'in')])
            if customer:
                if customer.code == cap:
                    values['code'] = 200
                    values['key'] = customer.type
                    values['vip'] = customer.vip
                    if datetime.datetime.fromtimestamp(expiresAt) > datetime.datetime.fromtimestamp(current_time):
                        payload = {
                            'sub': customer.phone,
                            'cap': customer.code,
                            'exp': datetime.datetime.utcnow() + datetime.timedelta(seconds=86400)
                        }
                        secret_key = '???'  # 用于签署 JWT 的密钥,请替换为你自己的密钥
                        token1 = jwt.encode(payload, secret_key, algorithm='HS256')
                        values['token'] = token1
                        values['message'] = "token验证成功!"
                        return values
                    else:
                        values['code'] = 202
                        values['message'] = "token过期!"
                        values['token'] = tk
                        return values
                else:
                    values['code'] = 203
                    values['message'] = "手机号和验证码已经更新,token失效"
                    values['token'] = tk
                    return values
        else:
            if not mobile or not captcha:
                values['code'] = 400
                values['message'] = "手机号和验证码不能为空!"
                return values
            customer = request.env['tutor.customer'].sudo().search([('phone', '=', mobile), ('state', '=', 'in')])
            if customer:
                if customer.code == captcha:
                    values['code'] = 200
                    values['message'] = "登陆成功!"
                    values['key'] = customer.type
                    values['vip'] = customer.vip
                    # 生成 JWT
                    payload = {
                        'sub': customer.phone,
                        'cap': customer.code,
                        'exp': datetime.datetime.utcnow() + datetime.timedelta(seconds=86400)
                    }
                    secret_key = '???'  # 用于签署 JWT 的密钥,请替换为你自己的密钥
                    token = jwt.encode(payload, secret_key, algorithm='HS256')
                    values['token'] = token

                    return values
                else:
                    values['code'] = 201
                    values['message'] = "验证码错误!"
                    return values
            else:
                values['code'] = 400
                values['message'] = "验证码未发送!"
                return values

这个接口是一个基于 Odoo 框架的 RESTful API 控制器。它处理一个名为 /quick_login 的 POST 请求,用于实现用户的快速登录功能。

这个接口的主要功能如下:

  1. 从请求参数中获取手机号码、验证码和 JWT token。
  2. 如果提供了 JWT token,则验证和解析 token 以获取用户信息。
    • 如果 token 合法且未过期,则更新 token 并返回用户信息。
    • 如果 token 过期或验证码已更新,则返回相应的错误信息。
  3. 如果未提供 JWT token,则验证用户输入的手机号和验证码是否匹配。
    • 如果验证成功,则生成一个新的 JWT token 并返回用户信息。
    • 如果验证码错误或未发送,则返回相应的错误信息。

该接口的一些关键点包括:

  • 使用 http.Controller 基类和 http.route 装饰器定义了一个 RESTful API 端点。
  • 使用 Odoo 的 ORM 操作数据库,查询和更新客户记录。
  • 使用 json 模块处理 JSON 数据。
  • 使用 jwt 库生成和验证 JWT token。
  • 通过异常处理机制捕获并处理可能发生的错误。

需要注意的是,这个接口中存在一些未知的参数和配置,如 JWT 签名密钥等。在实际使用时,这些参数需要根据具体的部署环境进行配置。

另外,这个接口还使用了一些 Odoo 特有的概念,如 tutor.customer 模型。在实际使用时,你需要确保你的 Odoo 环境中存在这个模型,并且它的字段和逻辑与这个接口所使用的内容相匹配。

总的来说,这个接口实现了一个基于 JWT 的用户快速登录功能,利用了 Odoo 的 ORM 和 RESTful API 特性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值