-
Notifications
You must be signed in to change notification settings - Fork 4.4k
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
golang v0.7.0 api not passing acl token #2403
Comments
Using the v0.6.4 api the token is passed as a query parameter and the call returns the expected result. This breakage in the api must have happened somewhere between the v0.6.4 and v0.7.0 release. |
There was a change to use an http header instead of the query parameter. Do you see the token coming in as a header?
|
@slackpad I could sniff the transaction and/or point the test code above to a dummy webserver. What I have tested:
I suspect the header is not being passed by the v0.7.0 API with either the client config or the QueryOptions set. I will try and get confirmation though by using a dummy http server. |
Linking to #2233 which was the header change. |
I've worked up a really simple test that doesn't even use a consul server. It really looks like the 0.7.0 api client isn't sending the header. https://github.com/leprechau/api-test
|
Here is a curl against the same test listener ... The Request
The Listener
|
@leprechau thanks for the repro case. This is super weird as I see the token header going into the |
Hi @leprechau I think the root cause of this one is golang/go#4800. With older versions of Go, the HTTP client will drop the headers when it is following redirects. It looks like a fix for this is teed up in master and will go out with the next release of Go, but in the meantime, if you get rid of the slash you won't get the redirect and the headers will display: diff --git a/test.go b/test.go
index afd24fd..d4c3685 100644
--- a/test.go
+++ b/test.go
@@ -9,7 +9,7 @@ func cTest() api.KVPairs {
config := api.DefaultConfig()
config.Token = "testToken"
client, _ := api.NewClient(config)
- kvps, _, _ := client.KV().List("/", nil)
+ kvps, _, _ := client.KV().List("", nil)
return kvps
}
@@ -18,7 +18,7 @@ func optTest() api.KVPairs {
opts := &api.QueryOptions{
Token: "testToken",
}
- kvps, _, _ := client.KV().List("/", opts)
+ kvps, _, _ := client.KV().List("", opts)
return kvps
} Your sample app happened to have the same behavior as Consul because it was querying with a double slash. I think we should make the API client smarter and drop any leading slash in the KV path, since it's not necessary. |
@slackpad Interesting ... that makes sense. I also agree about enhancing the API client to not hard-code the prefixing slash when making requests. That was a rabbit hole. |
Yeah I don't think there are other redirect spots in the API other than if you are getting the UI, so this shouldn't affect folks except for this KV case. Appreciate the repro case - that helped me narrow this down after a lot of head scratching - finally ended up doing a request against |
Nice work and glad I could help. Looking through that golang issue this has bitten quite a few people. It's always nice to have company in these types of issues. |
Updating the TLS options to use the API features provided with the v0.7.0 API. We previouslly updated to 0.7.0 release but then rolled back due to an issue with the KV store and token passing. However we found a workaround in hashicorp/consul#2403 that should correct the issue.
Running Consul v0.7.0 with a simple single instance dev cluster it appears that the current
consul/api
package is not passing ACL tokens as expected. The below example code tries to set thetoken
in both the client config and as a query option. Both methods fail to pass the?token
parameter to the call made by the api package.Example Code
Shell Output
Consul Log Output
CURL With Query Parameter
CURL With Header
The text was updated successfully, but these errors were encountered: