Unable to resolve " not a valid key=value pair (missing equal-sign) in Authorization header" when POSTing to api gateway
Question:
I created an api-gateway to put data in my s3 bucket. When I test it in console it works with no problem. Even when I test my token in the authorizer test it returns an “Allow”, so there’s nothing wrong with my token. My token validation is
^Bearer [-0-9a-zA-z.]*$
so my python code for generating my header looks like this:
headers = {
"Authorization": "Bearer " + token,
"Content-type": "application/json"
}
The rest of my code is:
response = requests.post(url, headers=headers, data={"id":"0678a93d-ee8c-4db5-a831-1e311be4f04b", "test":"12345"})
print(response.text)
The error message I get is
“{“message”:”‘{My Token}’ not a valid key=value pair (missing equal-sign) in Authorization header: ‘Bearer {My Token}’.”}”
My url looks like this:
https://my-api-gateway.amazonaws.com/MyStage, and I am using a {proxy+} in my resources. I noticed if I change my header from Content-type to Accept, it gives me the same error, but if I also change my url to https://my-api-gateway.amazonaws.com/MyStage/any-arbitrary-string/, I get a
{"response":{"status":"VALID", "message": "success"}}
but the file does not show up in my s3 bucket. How do I resolve this?
Answers:
I resolved it. I changed my method to come from the root resource (instead of the unnecessary {proxy+}, and also noticed that my python method was incorrect. I had response = requests.post(url, headers=headers, data=my_json)
, but data only accepts a string. I have to use either requests.post(url, headers=headers, json=my_json)
or requests.post(url, headers=headers,data=json.dumps(my_json))
When using “{proxy+}” in the path, you also need to add a root path. Adding “{proxy+}” is how api gateway knows you are using Lambda proxy integration. So don’t leave it out.
viz.,
Type: AWS::Serverless::Function
Properties:
Events:
ProxyResource:
Type: Api
Properties:
RestApiId: ...
Path: /{proxy+}
Method: ANY
RootResource:
Type: Api
Properties:
RestApiId: ...
Path: /
Method: ANY
For me the reason why it didn’t work is because I didn’t redeploy when making changes to the integration.
So if you use terraform to create resources, you need to include the triggers
part. See: https://www.terraform.io/docs/providers/aws/r/api_gateway_deployment.html#redeployment-triggers
I have run across this error when the resolved URL was incorrect. (Or without a proxy but with an incorrect URL.)
I had faced the same issue. For me, the issue was due to a case-sensitive url. Please make sure, the spelling and the casing of each of the words are correct.
I had the same error when just running AWS.config.update. I had an extra space character and it gave this error. Just posting it here as it wasn’t clear – but easily discoverable I am sure.
in my case very similar,
using third api payment has wrong set on request METHOD , instead of DELETE I use POST. ah my bad.
In my case, I chose wrong method.
Please check your request method
For me, the issue was similarly an incorrect URL. My endpoint was meant to accept another URL as a path argument; and I’d applied Pyton’s urllib.parse.quote(url)
instead of urllib.parse.quote_plus(url)
, so I was making requests to https://apigw.playground.sweet.io/gameplay/pack/https%3A//collectible.playground.sweet.io/series/BjqGOJqp instead of https://apigw.playground.sweet.io/gameplay/pack/https%3A%2F%2Fcollectible.playground.sweet.io%2Fseries%2FBjqGOJqp
When I got this, I was being braindead and was hitting the apigateway root, and not an endpoint with a handler.
for postman code generator , please make sure to remove unnecessary spaces from the URL , that was my issue
in my case it worked when I replaced POST by PATCH
curl_setopt_array($curl, array(
...
CURLOPT_CUSTOMREQUEST => 'PATCH',
...
Along with Will’s answer, please also ensure the URL that you are calling is same case (lowercase or otherwise) as defined in API Gateway. The URL is case-sensitive
I created an api-gateway to put data in my s3 bucket. When I test it in console it works with no problem. Even when I test my token in the authorizer test it returns an “Allow”, so there’s nothing wrong with my token. My token validation is
^Bearer [-0-9a-zA-z.]*$
so my python code for generating my header looks like this:
headers = {
"Authorization": "Bearer " + token,
"Content-type": "application/json"
}
The rest of my code is:
response = requests.post(url, headers=headers, data={"id":"0678a93d-ee8c-4db5-a831-1e311be4f04b", "test":"12345"})
print(response.text)
The error message I get is
“{“message”:”‘{My Token}’ not a valid key=value pair (missing equal-sign) in Authorization header: ‘Bearer {My Token}’.”}”
My url looks like this:
https://my-api-gateway.amazonaws.com/MyStage, and I am using a {proxy+} in my resources. I noticed if I change my header from Content-type to Accept, it gives me the same error, but if I also change my url to https://my-api-gateway.amazonaws.com/MyStage/any-arbitrary-string/, I get a
{"response":{"status":"VALID", "message": "success"}}
but the file does not show up in my s3 bucket. How do I resolve this?
I resolved it. I changed my method to come from the root resource (instead of the unnecessary {proxy+}, and also noticed that my python method was incorrect. I had response = requests.post(url, headers=headers, data=my_json)
, but data only accepts a string. I have to use either requests.post(url, headers=headers, json=my_json)
or requests.post(url, headers=headers,data=json.dumps(my_json))
When using “{proxy+}” in the path, you also need to add a root path. Adding “{proxy+}” is how api gateway knows you are using Lambda proxy integration. So don’t leave it out.
viz.,
Type: AWS::Serverless::Function
Properties:
Events:
ProxyResource:
Type: Api
Properties:
RestApiId: ...
Path: /{proxy+}
Method: ANY
RootResource:
Type: Api
Properties:
RestApiId: ...
Path: /
Method: ANY
For me the reason why it didn’t work is because I didn’t redeploy when making changes to the integration.
So if you use terraform to create resources, you need to include the triggers
part. See: https://www.terraform.io/docs/providers/aws/r/api_gateway_deployment.html#redeployment-triggers
I have run across this error when the resolved URL was incorrect. (Or without a proxy but with an incorrect URL.)
I had faced the same issue. For me, the issue was due to a case-sensitive url. Please make sure, the spelling and the casing of each of the words are correct.
I had the same error when just running AWS.config.update. I had an extra space character and it gave this error. Just posting it here as it wasn’t clear – but easily discoverable I am sure.
in my case very similar,
using third api payment has wrong set on request METHOD , instead of DELETE I use POST. ah my bad.
In my case, I chose wrong method.
Please check your request method
For me, the issue was similarly an incorrect URL. My endpoint was meant to accept another URL as a path argument; and I’d applied Pyton’s urllib.parse.quote(url)
instead of urllib.parse.quote_plus(url)
, so I was making requests to https://apigw.playground.sweet.io/gameplay/pack/https%3A//collectible.playground.sweet.io/series/BjqGOJqp instead of https://apigw.playground.sweet.io/gameplay/pack/https%3A%2F%2Fcollectible.playground.sweet.io%2Fseries%2FBjqGOJqp
When I got this, I was being braindead and was hitting the apigateway root, and not an endpoint with a handler.
for postman code generator , please make sure to remove unnecessary spaces from the URL , that was my issue
in my case it worked when I replaced POST by PATCH
curl_setopt_array($curl, array(
...
CURLOPT_CUSTOMREQUEST => 'PATCH',
...
Along with Will’s answer, please also ensure the URL that you are calling is same case (lowercase or otherwise) as defined in API Gateway. The URL is case-sensitive