-
Notifications
You must be signed in to change notification settings - Fork 170
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[THREESCALE-4393] Add support to use Basic Authentication with the forward proxy #1409
Changes from all commits
3dc087e
6fcf36b
caa1db9
b6081f7
adf7c93
836babc
260dca5
4769da4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -315,3 +315,194 @@ ETag: foobar | |
<<EOF | ||
using proxy: http://127.0.0.1:$Test::Nginx::Util::PROXY_SSL_PORT, | ||
EOF | ||
|
||
|
||
=== TEST 5: API backend connection uses http proxy with Basic Auth | ||
Check that the Proxy Authorization header is not sent | ||
--- configuration | ||
{ | ||
"services": [ | ||
{ | ||
"id": 42, | ||
"backend_version": 1, | ||
"backend_authentication_type": "service_token", | ||
"backend_authentication_value": "token-value", | ||
"proxy": { | ||
"api_backend": "http://test-upstream.lvh.me:$TEST_NGINX_SERVER_PORT/", | ||
"proxy_rules": [ | ||
{ "pattern": "/", "http_method": "GET", "metric_system_name": "hits", "delta": 2 } | ||
], | ||
"policy_chain": [ | ||
{ | ||
"name": "apicast.policy.apicast" | ||
}, | ||
{ | ||
"name": "apicast.policy.camel", | ||
"configuration": { | ||
"http_proxy": "http://foo:[email protected]:$TEST_NGINX_HTTP_PROXY_PORT" | ||
} | ||
} | ||
] | ||
} | ||
} | ||
] | ||
} | ||
--- backend | ||
location /transactions/authrep.xml { | ||
content_by_lua_block { | ||
ngx.exit(ngx.OK) | ||
} | ||
} | ||
--- upstream | ||
server_name test-upstream.lvh.me; | ||
location / { | ||
access_by_lua_block { | ||
assert = require('luassert') | ||
local proxy_auth = ngx.req.get_headers()['Proxy-Authorization'] | ||
assert.falsy(proxy_auth) | ||
ngx.say("yay, api backend") | ||
} | ||
} | ||
--- request | ||
GET /?user_key=value | ||
--- response_body | ||
yay, api backend | ||
--- error_code: 200 | ||
--- error_log env | ||
using proxy: http://foo:[email protected]:$TEST_NGINX_HTTP_PROXY_PORT | ||
|
||
=== TEST 6: API backend using all_proxy with Basic Auth | ||
Check that the Proxy Authorization header is not sent | ||
--- configuration | ||
{ | ||
"services": [ | ||
{ | ||
"id": 42, | ||
"backend_version": 1, | ||
"backend_authentication_type": "service_token", | ||
"backend_authentication_value": "token-value", | ||
"proxy": { | ||
"api_backend": "http://test-upstream.lvh.me:$TEST_NGINX_SERVER_PORT/", | ||
"proxy_rules": [ | ||
{ "pattern": "/", "http_method": "GET", "metric_system_name": "hits", "delta": 2 } | ||
], | ||
"policy_chain": [ | ||
{ | ||
"name": "apicast.policy.apicast" | ||
}, | ||
{ | ||
"name": "apicast.policy.camel", | ||
"configuration": { | ||
"all_proxy": "http://foo:[email protected]:$TEST_NGINX_HTTP_PROXY_PORT" | ||
} | ||
} | ||
] | ||
} | ||
} | ||
] | ||
} | ||
--- backend | ||
location /transactions/authrep.xml { | ||
content_by_lua_block { | ||
ngx.exit(ngx.OK) | ||
} | ||
} | ||
--- upstream | ||
server_name test-upstream.lvh.me; | ||
location / { | ||
access_by_lua_block { | ||
assert = require('luassert') | ||
local proxy_auth = ngx.req.get_headers()['Proxy-Authorization'] | ||
assert.falsy(proxy_auth) | ||
ngx.say("yay, api backend") | ||
} | ||
} | ||
--- request | ||
GET /?user_key=value | ||
--- response_body | ||
yay, api backend | ||
--- error_code: 200 | ||
--- error_log env | ||
using proxy: http://foo:[email protected]:$TEST_NGINX_HTTP_PROXY_PORT | ||
|
||
|
||
=== TEST 7: using HTTPS proxy for backend with Basic Auth. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I wonder how this works with the camel proxy when upstream is TLS. You are adding the Does it even make sense to add authentication support on camel proxy when upstream is TLS? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Now I see your comment
Regarding Regarding There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Anyway, the integration tests for the TLS upstream does not make sense as it is for now. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. so I talked to few friends from the FuseSource team and no one really knows what's called a camel proxy. The example you provided is built using Camel netty-http. And checking the source code of netty-http it looks like it doesn't support proxy authentication and CONNECT out of the box. With that said, I believe the camel proxy's behavior will depend on the implementation. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The whole point of camel proxy is to proxy the request without CONNECT, otherwise they can just use the normal proxy. I would vote to not support authentication with camel proxy. Let me know what you think and I will push a new patch There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It is being supported feature https://access.redhat.com/documentation/en-us/red_hat_3scale_api_management/2.13/html/administering_the_api_gateway/apicast-policies#camel-service_standard-policies IDK how many customers are using it, tho What I would do is to add doc (a note somewhere) saying that camel proxying does not support basic client auth. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's already in the camel proxy Readme file There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Also fixed the camel proxy integration tests |
||
Check that the Proxy Authorization header is not sent | ||
--- init eval | ||
$Test::Nginx::Util::PROXY_SSL_PORT = Test::APIcast::get_random_port(); | ||
$Test::Nginx::Util::ENDPOINT_SSL_PORT = Test::APIcast::get_random_port(); | ||
--- configuration random_port env eval | ||
<<EOF | ||
{ | ||
"services": [ | ||
{ | ||
"backend_version": 1, | ||
"proxy": { | ||
"api_backend": "https://127.0.0.1:$Test::Nginx::Util::ENDPOINT_SSL_PORT", | ||
"proxy_rules": [ | ||
{ "pattern": "/test", "http_method": "GET", "metric_system_name": "hits", "delta": 2 } | ||
], | ||
"policy_chain": [ | ||
{ | ||
"name": "apicast.policy.apicast" | ||
}, | ||
{ | ||
"name": "apicast.policy.camel", | ||
"configuration": { | ||
"https_proxy": "http://foo:bar\@127.0.0.1:$Test::Nginx::Util::PROXY_SSL_PORT" | ||
} | ||
} | ||
] | ||
} | ||
} | ||
] | ||
} | ||
EOF | ||
--- backend | ||
location /transactions/authrep.xml { | ||
content_by_lua_block { | ||
ngx.exit(ngx.OK) | ||
} | ||
} | ||
--- upstream eval | ||
<<EOF | ||
# Endpoint config | ||
listen $Test::Nginx::Util::ENDPOINT_SSL_PORT ssl; | ||
|
||
ssl_certificate $Test::Nginx::Util::ServRoot/html/server.crt; | ||
ssl_certificate_key $Test::Nginx::Util::ServRoot/html/server.key; | ||
|
||
server_name _ default_server; | ||
|
||
location /test { | ||
access_by_lua_block { | ||
ngx.say("yay, endpoint backend") | ||
|
||
} | ||
} | ||
} | ||
server { | ||
# Proxy config | ||
listen $Test::Nginx::Util::PROXY_SSL_PORT ssl; | ||
|
||
ssl_certificate $Test::Nginx::Util::ServRoot/html/server.crt; | ||
ssl_certificate_key $Test::Nginx::Util::ServRoot/html/server.key; | ||
|
||
|
||
server_name _ default_server; | ||
|
||
location ~ /.* { | ||
proxy_http_version 1.1; | ||
proxy_pass https://\$http_host; | ||
} | ||
EOF | ||
--- request | ||
GET /test?user_key=test3 | ||
--- error_code: 200 | ||
--- user_files fixture=tls.pl eval | ||
--- error_log eval | ||
<<EOF | ||
using proxy: http://foo:bar\@127.0.0.1:$Test::Nginx::Util::PROXY_SSL_PORT, | ||
EOF | ||
--- no_error_log eval | ||
[qr/\[error\]/, qr/\got header line: Proxy-Authorization: Basic Zm9vOmJhcg==/] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
IMO not very accurate
Correct.
All proxy URLs should be
http
based, neverhttps
based.If upstream is http -> then HTTP_PROXY is used by apicast
if upstream is https -> then HTTPS_PROXY is used by apicast
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's exactly what I meant when I said
For this reason, the HTTPS_PROXY value scheme is restricted to http.
Maybe that causes more confusion, maybe we should delete that sentence?