来自 HAProxy 或 Apache 的 OAuth 令牌验证 mod_proxy

OAuth token validation from HAProxy or Apache mod_proxy

我在 3 个节点上部署了一个微服务,这些节点位于内部网络中的 HAProxy 负载均衡器后面。这些服务使用 OAuth2 APIS 授权服务器进行保护。现在,我想将 HAProxy 移动到 DMZ。我想拒绝 header 中没有授权令牌的请求,并通过调用 OAuth REST API.

来验证授权令牌

在 HAProxy 中,我找不到执行此操作的方法。有一个 option httpchk 可用于健康检查。我正在寻找可用于验证每个传入请求的类似功能。

谁能帮我建议如何使用 HAProxy 或 Apache mod_proxy 来实现这个?

Apache 模块 mod_auth_openidc 允许您针对授权服务器验证 OAuth 2.0 令牌,请参阅:https://github.com/zmartzone/mod_auth_openidc。该模块可以与 mod_proxy 结合使用以实现您想要的。

In HAProxy I couldn't find a way to do this.

郑重声明,从 2021 年起您可以。这里有一篇关于使用OAuth https://www.haproxy.com/blog/using-haproxy-as-an-api-gateway-part-2-authentication/.

的HAProxy官方博客post

TL;DR: 安装 this haproxy-lua-oauth script,然后你就可以像这个片段

frontend api_gateway
   # Always use HTTPS to protect the secrecy of the token
   bind :443 ssl crt /usr/local/etc/haproxy/pem/test.com.pem

   # Accept GET requests and skip further checks
   http-request allow if { method GET }
   
   # Deny the request if it's missing an Authorization header
   http-request deny unless { req.hdr(authorization) -m found }
   
   # Verify the token by invoking the jwtverify Lua script 
   http-request lua.jwtverify
   
   # Deny the request unless 'authorized' is true
   http-request deny unless { var(txn.authorized) -m bool }
   
   # (Optional) Deny the request if it's a POST/DELETE to a 
   # path beginning with /api/hamsters, but the token doesn't 
   # include the "write:hamsters" scope
   http-request deny if { path_beg /api/hamsters } { method POST DELETE } ! { var(txn.oauth_scopes) -m sub write:hamsters }
   
   # If no problems, send to the apiservers backend
   default_backend apiservers