Query Parameter ApiKey
This example modifies the out-of-the-box AuthApiKey authenticator to send
an API key as a query parameter instead of in a header key. The code for the
AuthApiKey is shown below with the highlighted text that will be
changed:
1from silo.auth import Authenticator, add_auth, http_check_result
2
3@add_auth
4class AuthApiKey(Authenticator):
5 def __init__(self, credentials):
6 """Constructor method"""
7 Authenticator.__init__(self, credentials)
8 self.token_label = credentials.fields.get("auth_header", "Authorization")
9 self.prefix = credentials.fields.get("prefix", "")
10 self.suffix = credentials.fields.get("suffix", "")
11 self.apikey = credentials.fields["apikey"]
12 self.auth_info = {}
13 self.cred_filter = CredentialFilter(credentials)
14
15 def check_if_authenticated(self):
16 """Returns the current authentication status."""
17 return False
18
19 def check_result(self, result):
20 """Provides a check on the returned response from the REST request that was made."""
21 return http_check_result(result)
22
23 def authenticate(self):
24 """Updates the auth_info with the ApiKey/Token using the credentials provided.
25
26 :return: If the auth_info is updated, return True, else return False
27 :rtype: boolean
28 """
29 ""
30 formatted_apikey = "{} {} {}".format(self.prefix, self.apikey, self.suffix).strip()
31 self.auth_info[self.token_label] = formatted_apikey
32 self.cred_filter.update_secret(self.token_label, formatted_apikey)
33 return True
34
35 def modify_request(self, res):
36 """Modifies a requests.Session headers or query_params to contain the updated
37 auth_info for a resource.
38
39 :param requests.Session res: a Session object
40
41 :return: If the session is authenticated, return True, else return False
42 :rtype: boolean
43 """
44 self.authenticate()
45 res.headers.update(self.auth_info)
46 return True
47
48 @staticmethod
49 def build(credentials, *args, **kwargs):
50 """Build method to be called by get_authmethod in Snippet Framework"""
51 return AuthApiKey(credentials)
52
53 @staticmethod
54 def get_name():
55 """Returns the name of the authentication method"""
56 return "AuthApiKey"
57
58 @staticmethod
59 def get_desc():
60 """Returns a description of the authentication method"""
61 return "ApiKey Authentication for HTTP"
Line 32 will be modified such that the apikey is stored in query parameters versus the header. res.headers.update(self.auth_info) is changed to res.params.update(self.auth_info).
Our new authenticator looks like the following:
from silo.auth import add_auth, AuthApiKey
@add_auth
class AuthApiKeyQuery(AuthApiKey):
def __init__(self, credentials, **kwargs):
"""Constructor method"""
AuthApiKey.__init__(self, credentials, **kwargs)
def modify_request(self, res):
"""Modifies a requests.Session query_params to contain the updated
auth_info for a resource.
:param requests.Session res: a Session object
:return: True
:rtype: boolean
"""
self.authenticate()
res.params.update(self.auth_info)
return True
@staticmethod
def build(credentials, **kwargs):
"""Build method to be called by get_authmethod in Snippet Framework"""
return AuthApiKeyQuery(credentials, **kwargs)
@staticmethod
def get_name():
"""Returns the name of the authentication method"""
return "AuthApiKeyQuery"
@staticmethod
def get_desc():
"""Returns a description of the authentication method"""
return "AuthApiKeyQuery Authentication for HTTP"
The AuthApiKeyQuery inherits from the existing AuthApiKey
authenticator for the token formatting done in authenticate().
The biggest change is in modify_request() where it saves the apikey
into the session’s parameters.
Putting It All Together
For a test, we will attempt to access a json payload listing
alternative fuel stations. This endpoint accepts the apikey
as a query parameter api_key=DEMO_KEY.
See Data Gov Dev Manual
Snippet
from silo.auth import add_auth, AuthApiKey
@add_auth
class AuthApiKeyQuery(AuthApiKey):
def __init__(self, credentials, **kwargs):
"""Constructor method"""
AuthApiKey.__init__(self, credentials, **kwargs)
def modify_request(self, res):
"""Modifies a requests.Session query_params to contain the updated
auth_info for a resource.
:param requests.Session res: a Session object
:return: True
:rtype: boolean
"""
self.authenticate()
res.params.update(self.auth_info)
return True
@staticmethod
def build(credentials, **kwargs):
"""Build method to be called by get_authmethod in Snippet Framework"""
return AuthApiKeyQuery(credentials, **kwargs)
@staticmethod
def get_name():
"""Returns the name of the authentication method"""
return "AuthApiKeyQuery"
@staticmethod
def get_desc():
"""Returns a description of the authentication method"""
return "AuthApiKeyQuery Authentication for HTTP"
Snippet Argument
low_code:
version: 2
steps:
- http:
url: https://developer.nrel.gov/api/alt-fuel-stations/v1.json
params:
limit: 1
check_status_code: False
- json
Credential
Note
The Authorization Header field is used to define the query
parameter which, in this case, must be the expected apikey.