You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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请求体。
  • 模块与代码加载:
    • 确认控制器所在的模块已经在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')
        # 后续逻辑...
    
    查看Odoo日志,确认参数是否正确传递。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:05:18