来自HAProxy或Apache mod_proxy

时间:2015-10-27 18:07:43

标签: oauth oauth-2.0 haproxy mod-proxy

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

在HAProxy中,我找不到办法做到这一点。有一个option httpchk可以用于健康检查。我正在寻找可用于验证每个传入请求的类似功能。

任何人都可以帮我建议如何使用HAProxy或Apache mod_proxy来实现这个?

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

<块引用>

在 HAProxy 中,我找不到办法做到这一点。

作为记录,从 2021 年开始,您可以。这是关于使用 OAuth https://www.haproxy.com/blog/using-haproxy-as-an-api-gateway-part-2-authentication/ 的 HAProxy 官方博客文章。

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

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