Source code for cityiq.token
# -*- coding: utf-8 -*-
"""
"""
import base64
import json
import logging
from binascii import crc32
from pathlib import Path
from time import time
import requests
logger = logging.getLogger(__name__)
[docs]def get_cached_token(cache_path, uaa, client, secret):
"""
Return a cached access token from the CityIQ service. Returns just the token. Use _get_token() to get the
full response
:param cache_path: Directory where cached token will be stored, if a directory or token name if a file
:param uaa: Url to the user authentication service
:param client:
:param secret:
:return: A token string
If a directory is specified in cache_dir, the file name will be 'cityiq-token-<crc>.json', with the CRC32 of the
source url. The token will be expired after 8 hours.
"""
EXPIRE_TIME = (8 * 60 * 60)
token_path = Path(cache_path)
if token_path.is_dir():
token_path = token_path.joinpath('cityiq-token-{:X}.json'.format(crc32(str(uaa).encode('ascii'))))
# Expire the token
try:
if token_path.exists() and token_path.stat().st_ctime + EXPIRE_TIME < time():
logger.debug('token: expired; deleting')
token_path.unlink()
except FileNotFoundError:
# This can happen in a concurrency case, where another process has changed the token
pass
if token_path.exists():
logger.debug('token: exists')
with token_path.open() as f:
response_text = f.read()
data = json.loads(response_text)
else:
logger.debug('token: fetching')
data = _get_token(uaa, client, secret)
with token_path.open('w') as f:
f.write(json.dumps(data))
return data['access_token']
[docs]def get_token(uaa, client, secret):
"""
Get an access token from the CityIQ service. Returns just the token. Use _get_token() to get the full response
:param uaa: Url to the user authentication service
:param client:
:param secret:
:return:
"""
return _get_token(uaa, client, secret)['access_token']
def _get_token(uaa, client, secret):
"""
Get an access token from the CityIQ service. Returns the full JSON response
:param uaa: Url to the user authentication service
:param client:
:param secret:
:return:
"""
uaa += '/oauth/token'
cs = (client + ':' + secret).encode('ascii')
credentials = base64.b64encode(cs)
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Cache-Control': 'no-cache',
'Authorization': b'Basic ' + credentials
}
params = {
'client_id': client,
'grant_type': 'client_credentials'
}
response = requests.post(uaa, headers=headers, data=params)
response.raise_for_status()
return response.json()