Odoo 15登录API返回‘Invalid credentials’问题排查及优化咨询
Odoo 15登录API返回"Invalid credentials"问题排查与优化方案
1. 导致API无法识别有效凭据的核心原因
你的代码存在两个关键问题:
- 参数获取方式错误:当路由设置
type="json"时,Odoo会把POST请求的JSON体解析到http.request.jsonrequest对象中,而非通过**kwargs传递。你当前用kwargs.get()根本拿不到请求里的username和password,导致硬编码的判断条件永远不成立,直接返回错误。 - 硬编码校验脱离实际用户系统:你写死的
username == "admin" and password == "admin"逻辑,和Odoo数据库中存储的加密密码完全无关,就算网页端能正常登录,这段代码也不会匹配实际用户的凭据。
2. 需检查的额外配置项
- 请求URL与格式:
- 确认请求URL完整,比如应该是
http://你的Odoo地址:端口/api/check_login,你写的http:///api/check_login缺少域名/IP,属于无效请求。 - 检查Postman请求头是否设置了
Content-Type: application/json,没有这个头Odoo无法解析JSON请求体。
- 确认请求URL完整,比如应该是
- 模块与代码加载:
- 确认控制器所在的模块已经在Odoo中安装,且修改代码后重启了Odoo服务,确保新代码被加载。
- 日志排查:在控制器里添加日志,查看实际接收到的参数:
查看Odoo日志,确认参数是否正确传递。import logging _logger = logging.getLogger(__name__) @http.route("/api/check_login", methods=["POST"], type="json", auth="public", csrf=False) def check_login(self): req_data = http.request.jsonrequest _logger.info(f"Received request data: {req_data}") username = req_data.get('username') password = req_data.get('password') # 后续逻辑...
3. Odoo中更优的用户认证方式
(1)调用Odoo内置认证方法
直接使用res.users模型的authenticate方法,校验数据库中存储的用户凭据,这是最贴合Odoo原生逻辑的方式:
# -*- coding: utf-8 -*- from odoo import http from odoo.exceptions import AccessDenied class TestApi(http.Controller): @http.route("/api/check_login", methods=["POST"], type="json", auth="public", csrf=False) def check_login(self): req_data = http.request.jsonrequest username = req_data.get('username') password = req_data.get('password') db = http.request.db try: # 调用Odoo内置认证 user_id = http.request.env['res.users'].sudo().authenticate(db, username, password, {}) if user_id: user = http.request.env['res.users'].sudo().browse(user_id) return { "message": "User is logged in.", "username": user.login, "user_id": user_id } except AccessDenied: return {"error": "Invalid credentials."}
(2)API密钥认证
Odoo 15支持用户生成API密钥,无需传递用户名密码,更安全:
- 用户在Odoo后台个人设置中生成API密钥。
- 请求时在头里添加
Authorization: Bearer <你的API密钥>,控制器中通过http.request.env.user获取当前认证用户。
(3)OAuth2认证
适合前后端分离或第三方集成场景,Odoo支持配置OAuth2客户端,用户可以通过第三方平台(如Google、企业AD)登录,或自定义OAuth2服务实现认证。
(4)JWT认证
自定义实现JWT生成与校验,用户登录成功后返回JWT Token,后续请求携带Token完成身份验证,适合无状态API场景。
内容的提问来源于stack exchange,提问作者sarm
相关产品推荐
相关产品推荐

