2017-03-16 52 views
5

我有一個HAProxy配置爲接受* .mysubdomain.com的請求。 HAProxy將解析子域(prod.mysubdomain.com或dev.mysubdomain.com的prod或dev)並轉發到正確的後端。存在兩個後端,一個用於生產,另一個用於開發。每個後端包含兩個指向每個子域中的Marathon LB實例的服務器條目。HAProxy中的JWT驗證

子域需要一個JWT cookie用於在後端進行身份驗證。我有公鑰檢查智威湯遜的有效性,但希望在HAProxy中這樣做。有沒有辦法添加我自己的代碼來在HAProxy配置中執行JWT合法性檢查?

的HAProxy的配置文件如下:

global 
    maxconn 256 

defaults 
    mode http 
    timeout connect 5000ms 
    timeout client 50000ms 
    timeout server 50000ms 

frontend http-in 
    bind *:80 
    mode http 

    # Returns true when one of the headers contains one of the strings either isolated or delimited by dots. This is used to perform domain name matching. 
    acl host_dev hdr_dom(host) -i dev 
    acl host_prod hdr_dom(host) -i prod 

    acl jwtPresent req.cook(JWT) -m found 

    use_backend prod_domain if jwtPresent host_prod 
    use_backend dev_domain if jwtPresent host_dev 

    default_backend prod_domain 

backend prod_domain 
    balance roundrobin 
    server prodDomain1 "${MARATHON_LB_PROD_1}" maxconn 32 check 
    server prodDomain2 "${MARATHON_LB_PROD_2}" maxconn 32 check 

backend dev_domain 
    balance roundrobin 
    server devDomain1 "${MARATHON_LB_DEV_1}" maxconn 32 check 
    server devDomain2 "${MARATHON_LB_DEV_2}" maxconn 32 check 
+0

我也是!如果HAP可以將請求注入爲請求頭,那將會更好。 –

回答

0

據我所知,HAProxy的不必進行邏輯驗證JWT的功能。相反,我實現了一個腳本,在Lua爲haproxy.cfg調用執行驗證:

global 
    maxconn 256 
    lua-load /choose_backend.lua 

defaults 
    mode http 
    timeout connect 5000ms 
    timeout client 50000ms 
    timeout server 50000ms 

frontend http-in 
    bind *:80 

    http-request set-header X-SSL-Client-DN    %{+Q}[ssl_c_s_dn] 


    http-request set-var(txn.backend_name) lua.backend_select() 
    use_backend %[var(txn.backend_name)] 

backend prod_domain 
    balance roundrobin 
    server prodDomain1 "${MARATHON_LB_PROD_1}" maxconn 32 check 
    server prodDomain2 "${MARATHON_LB_PROD_2}" maxconn 32 check 

backend dev_domain 
    balance roundrobin 
    server devDomain1 "${MARATHON_LB_DEV_1}" maxconn 32 check 
    server devDomain2 "${MARATHON_LB_DEV_2}" maxconn 32 check 
+0

你能分享lua腳本嗎? –

0

至於對方的回答中指出,你必須使用Lua的腳本。您可以使用lua-resty-jwtKong的現有實施。

注:

  • 這些代碼庫不簡潔。一個簡單的副本&粘貼將不起作用。所以你必須提取你需要的最低限度。
  • 你不能在你的Lua腳本中有依賴關係。只有普通的香草Lua。所以你必須擺脫所有require陳述。
  • 棘手的部分是HMAC的實現。
  • 避免在你的Lua腳本中進行任何I/O操作,例如文件,數據庫,網絡操作。

這不是一件容易的事。祝你好運!這是值得分享的東西。