2017-03-16 32 views
5

Tôi có cấu hình HAProxy để chấp nhận yêu cầu tới * .mysubdomain.com. HAProxy sẽ phân tích cú pháp tên miền phụ (prod hoặc dev từ prod.mysubdomain.com hoặc dev.mysubdomain.com) và chuyển tiếp tới phần phụ trợ chính xác. Hai backend tồn tại, một cho prod và một cho dev. Mỗi phụ trợ chứa hai mục máy chủ hướng tới các cá thể Marathon LB trên mỗi tên miền phụ.Xác thực JWT trong HAProxy

Tên miền phụ yêu cầu cookie JWT để xác thực trên chương trình phụ trợ. Tôi có khóa công khai để kiểm tra tính hợp lệ của JWT, nhưng muốn làm như vậy trong HAProxy. Có cách nào để thêm mã của riêng tôi để thực hiện kiểm tra tính hợp lệ JWT trong cấu hình HAProxy không?

Các tập tin cấu hình HAProxy là như sau:

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

Tôi cũng vậy! Nó sẽ còn tốt hơn nữa, nếu HAP có thể tiêm các yêu cầu như là Tiêu đề Yêu cầu. –

Trả lời

0

Theo như tôi có thể nói, HAProxy không có chức năng để thực hiện logic để phê chuẩn JWT. Thay vào đó, tôi đã triển khai một kịch bản trong Lua để haproxy.cfg gọi để thực hiện xác thực:

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

Bạn có thể chia sẻ tập lệnh lua không? –

0

Như câu trả lời khác đã chỉ ra, bạn phải sử dụng kịch bản lệnh Lua. Bạn có thể sử dụng các triển khai hiện có từ lua-resty-jwt hoặc Kong.

Ghi chú:

  • Những mã căn cứ không súc tích. Bản sao đơn giản & sẽ không hoạt động. Vì vậy, bạn phải trích xuất tối thiểu tối thiểu bạn cần.
  • Bạn không thể có phụ thuộc trong tập lệnh Lua của mình. Chỉ có vanilla Lua thuần túy. Vì vậy, bạn phải loại bỏ tất cả các tuyên bố require.
  • Phần khó khăn là triển khai HMAC.
  • Tránh bất kỳ hoạt động I/O nào trong tập lệnh Lua của bạn, ví dụ: tệp, cơ sở dữ liệu, hoạt động mạng.

Nó không phải là một thực hiện dễ dàng. Chúc may mắn! Đó là điều đáng để chia sẻ.

Các vấn đề liên quan