0

所以我的 Flask 应用程序中有 2 条路线

  • <host_name>/oauth/leg1
  • <host_name>/oauth/leg2

/oauth/leg1路由验证它的输入时,它调用 render_form() 来渲染一个表单,并form-action重新路由到/oauth/leg2路由。

表单 html 看起来像这样

<form action="{{ url_for('oauth.leg2') }}" method="POST">
  blah blah blah
</form>

表单动作中的url_for调用正确地呈现了oauth/leg2

这一切都很好。单击我的表单上的提交会将表单数据发送到oauth/leg2路由,一切都会按需要进行。

现在,我也使用 KarkenD API 网关。网关的 URL 为api.dev.tech/connect/v1. 所以主机名是api.dev.tech,但另外,我希望我的 Flask API 只能通过connect/v1我的网关路径访问。

所以我的 KrakenD 网关设置是这样的,

api.dev.tech/connect/v1/oauth/leg1被转发到<flask_app>/oauth/leg1 api.dev.tech/connect/v1/oauth/leg2被转发到<flask_app>/oauth/leg2

我的问题

当我访问api.dev.tech/connect/v1/oauth/leg1时,它会正确验证我的请求并呈现表单。单击我的表单上的提交后,action评估结果为oauth/leg2,并且此路径附加到主机 ( api.dev.tech) 因此表单输入数据被发送到api.dev.tech/oauth/leg2-> 这不是有效的网关路径,因此失败。

表单输入数据应该发送到api.dev.tech//oauth/leg2`

我不知道如何有条件地将这个connect/v1路径插入到表单操作 URL 中(connect/v1 应该只在请求通过 KrakenD 发送时插入,而不是在请求正常直接发送到 Flask 主机时插入)

我试过的

添加了呈现完整路径的_external选项url_for- 这反而开始呈现我的 Kubernetes 服务名称(我的烧瓶应用程序和 krakend 网关在 kubernetes 上运行)

可能的解决方案

  • 始终connect/v1在我的表单操作中添加,然后我的 API 只能通过网关间接访问,但不能直接使用。
  • 有一个忽略 connect/v1 的 KrakenD 设置,因此api.dev.tech/oauth/leg2被转发到<flask_app>/oauth/leg2. 我不喜欢这样,因为现在我的 KrakenD 配置中必须有一个异常值规则,该规则缺少connect/v1路径。
  • 修改我的 Flask 路由,使其中也包含connect/v1前缀——现在 Flask API 可以直接访问,也可以通过 KrakenD 间接使用。
4

0 回答 0