【问题标题】:Odoo Rest-API Failing to authenticateOdoo Rest-API 无法通过身份验证
【发布时间】:2019-11-22 20:42:05
【问题描述】:

我在 odoo12 中创建了一个 rest-api 模块,并正在使用邮递员检查端点,但在尝试验证用户时出现以下错误

没有为路径“/web/session/authenticate/”提供 CSRF 验证令牌

Odoo URL 默认受 CSRF 保护(当使用不安全访问时 HTTP 方法)。看 https://www.odoo.com/documentation/12.0/reference/http.html#csrf 为 更多细节。

  • 如果通过 py-QWeb 表单通过 Odoo 访问此端点,则嵌入 CSRF 表格中的令牌,令牌可通过request.csrf_token()获得 可以通过隐藏输入提供,并且必须以 POST 命名 csrf_token 例如在您的表单中添加:

  • 如果表单是用 javascript 生成或发布的,则令牌值为 在web.core 上以csrf_tokencsrf_token 的形式提供

  • 列表项

    默认 js-qweb 执行上下文中的值

    • 如果表单被外部第三方访问(例如 REST API 端点,支付网关回调),您将需要禁用 CSRF 保护(并在必要时实施您自己的保护)通过 将csrf=False 参数传递给route 装饰器。

【问题讨论】:

  • 您使用的是哪种请求?

标签: python-3.6 odoo-12


【解决方案1】:

一个快速但不推荐的修复方法可能是在验证方法路由中添加 csrf=false,正如他们在第 3 点中所说的不确定为什么不推荐但可能会使来自 Web 的路由不太安全,但对于 API 来说一切都很好

from odoo.addons.web.controllers.main import Home
class HomeExt(Home):
    @http.route(csrf=false)
    def authenticate(self, db, login, password, base_location=None):
        request.session.authenticate(db, login, password)
        return request.env['ir.http'].session_info()

【讨论】:

  • 我很确定这可以在不必将 csrf 设置为 false 的情况下实现...感谢您的回答,它有效,但正在寻找正确的方法...
  • 是的,可能但不是根据文档,就像最后一点所说的“你需要禁用 CSRF 保护(并在必要时实施你自己的保护)”也在寻找更好的方法来处理这个
猜你喜欢
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 2015-09-15
  • 2015-04-01
相关资源
最近更新 更多