JWT (JSON Web Token) 是一种开放标准(RFC 7519),用于在网络应用程序中安全地表示声明。它是一个经过数字签名的 JSON 对象,可以包含一些实体(如用户)的身份验证和授权数据。JWT 通常用于在客户端和服务器之间传输身份验证和授权信息,并可用于以安全的方式进行单点登录(SSO)。
JWT 的主要特点包括:
-
可扩展: JWT 可以包含任意的 JSON 数据,因此可以很容易地扩展来满足不同的需求。
-
紧凑: JWT 的数据以 Base64 编码,因此非常紧凑,适合在 URL、HTTP Header 和 HTTP POST 参数中传输。
-
自包含: JWT 包含了所有必要的信息,减少了额外的数据库查询。
-
可验证: 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 请求,用于实现用户的快速登录功能。
这个接口的主要功能如下:
- 从请求参数中获取手机号码、验证码和 JWT token。
- 如果提供了 JWT token,则验证和解析 token 以获取用户信息。
- 如果 token 合法且未过期,则更新 token 并返回用户信息。
- 如果 token 过期或验证码已更新,则返回相应的错误信息。
- 如果未提供 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 特性。