Skip to content

Commit

Permalink
Merge pull request #62 from neuroscout/auto-refresh
Browse files Browse the repository at this point in the history
Auto refresh token
  • Loading branch information
adelavega committed Jan 24, 2020
2 parents 8dd564b + 9ffd1f4 commit 50635ca
Show file tree
Hide file tree
Showing 15 changed files with 7,976 additions and 3,121 deletions.
36 changes: 27 additions & 9 deletions pyns/api.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import requests
import re
from functools import partialmethod
import jwt
import os
from datetime import datetime
from functools import partialmethod

from . import API_BASE_URL, ROUTE_PATTERN
from . import models
Expand All @@ -21,12 +23,7 @@ def __init__(self, email=None, password=None, api_base_url=None):
self._api_base_url = api_base_url or API_BASE_URL
self._api_token = None

if email is not None and password is not None:
self._authorize(email, password)
elif all([a in os.environ
for a in ['NEUROSCOUT_PASSWORD', 'NEUROSCOUT_USER']]):
self._authorize(os.environ['NEUROSCOUT_USER'],
os.environ['NEUROSCOUT_PASSWORD'])
self._authorize(email, password)

# Set up main routes
self.analyses = models.Analyses(self)
Expand Down Expand Up @@ -79,6 +76,10 @@ def _make_request(self, request, route, sub_route=None, id=None,
json=None, headers=None, remove_null=True,
files=None, **kwargs):
""" Generic request handler """

if route != 'auth':
self._check_expiry()

request_function = getattr(self._session, request)

if remove_null is True:
Expand Down Expand Up @@ -124,8 +125,25 @@ def _make_request(self, request, route, sub_route=None, id=None,

def _authorize(self, email=None, password=None):
""" Fetch api_token given access credentials """
rv = self._post('auth', email=email, password=password)
self._api_token = rv['access_token']
if email is None and 'NEUROSCOUT_USER' in os.environ:
email = os.environ['NEUROSCOUT_USER']
if password is None and 'NEUROSCOUT_PASSWORD' in os.environ:
password = os.environ['NEUROSCOUT_PASSWORD']

if email is not None and password is not None:
rv = self._post('auth', email=email, password=password)
self._api_token = rv['access_token']

iat = datetime.utcfromtimestamp(
jwt.decode(self._api_token, verify=False)['iat'])
adj = iat - datetime.now()
self._api_token_exp = datetime.utcfromtimestamp(
jwt.decode(self._api_token, verify=False)['exp']) - adj

def _check_expiry(self):
if self._api_token is not None:
if datetime.now() > self._api_token_exp:
self._authorize()

_get = partialmethod(_make_request, 'get')
_post = partialmethod(_make_request, 'post')
Expand Down
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ betamax_serializers>=0.2.0
tqdm>=4.30.0
altair>=4.0.0
vega>=2.6.0
pyjwt>=1.7.1
8 changes: 4 additions & 4 deletions tests/cassettes/analysis.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"http_interactions": [
{
"recorded_at": "2020-01-10T19:38:50",
"recorded_at": "2020-01-24T19:39:56",
"request": {
"body": {
"encoding": "utf-8",
Expand All @@ -15,7 +15,7 @@
"gzip, deflate"
],
"Authorization": [
"JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NzkyODk2NjcsImlhdCI6MTU3ODY4NDg2NywibmJmIjoxNTc4Njg0ODY3LCJpZGVudGl0eSI6MX0.mBIekUDEYBfJyFh3sSLnXm9EX1PJeBe_zFvRLrA1UMI"
"JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1ODA0OTkzMDEsImlhdCI6MTU3OTg5NDUwMSwibmJmIjoxNTc5ODk0NTAxLCJpZGVudGl0eSI6MX0.-vuaHxl4z9VE3-FJiRcUfF2NKrKP8SrnZVGXPTuw1uo"
],
"Connection": [
"keep-alive"
Expand All @@ -35,7 +35,7 @@
},
"response": {
"body": {
"base64_string": "H4sIAAAAAAAAA42RT0vDQBDF736MOaeSxH81N7EIohVpgwhSwjSZ2rXJZtmdLYTQ7+5s04oeCt523+z89s2bHvIZZMn5VQSlJWSqCmTIII3TeBQnoyTOk9vsAiKokNERF6qCTF5X5EqrDKtWQ6Z9XUewRrfel2H6+vR2KT11W25IhBXWjiJo2opqyHp41MZzOMz98otKOX5AOoZFBDm6TQCQrZWetltFsIvgBRsS1XRMjgvUWHdOOflgzmScdPdw32q26DjchDPxTdP90nrIOxMYHHjPtA1GYOa1QKZHW+/Bx9KqzzVrcg4W8jS3qN2qtQ2GUff0XdT/kz8ZMoNdIMn0aqVOB6xPDWnQkh6CH4I2lipVHvwA/AitDf6S9CYdL4KotrJQyNh6Cd96PVSvpeYY2YfmyezuIReC88tG8XH9wzfifVMcXP1ZyNk3UJ/jvDYCAAA=",
"base64_string": "H4sIAAAAAAAAA42RQU/DMAyF7/wMnzu0FhijN8SEhGActh6Q0FRlrcdC07SKnaGq2n/HWTcEh0nckuf4y/NzD9kC0vjyJoLCoWIsc8WQQjJOxqNxPEqus/guvYIISsWKkHNdQiqvS6TC6ZZ1YyG13pgItoq2hzJ8Vc9mIj2mKSoUYaMMYQR1U6KBtIcn23oOh6Vff2Ihx3dIprCKIFNUCWCOzmg7b3YaYR/Bq6pR1LZjJM6VVaYjTfLBkrEl6e7hobHsFHG4CWfm67r7pfWQdW1gcOC94C4YgYW3ApmfbL0FH2unP7ZskQhW8jRzytKmcbUKox7o+6j/J382ZAb7QJLp9UafD9ieG7JVDu0Q/BB067DUxdEPwI/QuOAvTm6T6SqIeicLhZSdl/Cdt0N1IjVixT40zxb3j5kQyK9rzaf1D9+I9yo/uvqzkItv+DoNljYCAAA=",
"encoding": null,
"string": ""
},
Expand All @@ -53,7 +53,7 @@
"application/json"
],
"Date": [
"Fri, 10 Jan 2020 19:38:50 GMT"
"Fri, 24 Jan 2020 19:39:56 GMT"
],
"Server": [
"nginx/1.15.6"
Expand Down
34 changes: 17 additions & 17 deletions tests/cassettes/analysis_object.json

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions tests/cassettes/auth.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"http_interactions": [
{
"recorded_at": "2020-01-10T19:34:27",
"recorded_at": "2020-01-24T19:35:01",
"request": {
"body": {
"encoding": "utf-8",
Expand All @@ -15,7 +15,7 @@
"gzip, deflate"
],
"Authorization": [
"JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NzkyODk2NjcsImlhdCI6MTU3ODY4NDg2NywibmJmIjoxNTc4Njg0ODY3LCJpZGVudGl0eSI6NX0.Zch97dJV4FnOU6NMM_TQjtwfrjHfn0WR0HqXqabGPns"
"JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1ODA0OTkzMDEsImlhdCI6MTU3OTg5NDUwMSwibmJmIjoxNTc5ODk0NTAxLCJpZGVudGl0eSI6NX0.7yJ_A6LMtuJqznSfQAsHqk6Vo0HnZWpKaEQ7M8Cid18"
],
"Connection": [
"keep-alive"
Expand All @@ -35,7 +35,7 @@
},
"response": {
"body": {
"base64_string": "H4sIAAAAAAAAAxWMyQ6CMBRF934GH2CoGBPcgQy2QnGCFDdE6xMKFIw4gfHfrcuTe+75aEfOoeuye1tBo8016IkOzBKRIKsEbUSwIMXJ53/G8YARFcQcK6mGpZJKF9Gh6iOnmtCSd1jWxXmBZ+E+NiInnVInn9D+JU6SSFy2b7rnU1rmutoMFb4e/ORx9msddurD9LG0MVSx46b2hfReYXS7oGHSdBlaE7AhG7znNrhZKA6x9h39AJNi4CW8AAAA",
"base64_string": "H4sIAAAAAAAAAxWMuw6CMAAAdz+DHVNEjbgRXrZIi9ISwmKwVq2AGBBBjP8ujpfc3UfJOBdNc3hWubgra0W8ERCJKYlEfqzt5NZC16PH/wzZADUskTEdpUJsRunmaMQ2AaH5ENhOA8vierLgMqBMJ/SywDbrgqiTxxKV8Fb1mPIFsXOAqdmP40fqxe3JK4CIxiYBU/XVZpu+mA9G7Oiqi+Ses7M7w37th6uovqexl4S07bS2Ur6THwpPVXy8AAAA",
"encoding": null,
"string": ""
},
Expand All @@ -53,7 +53,7 @@
"application/json"
],
"Date": [
"Fri, 10 Jan 2020 19:34:27 GMT"
"Fri, 24 Jan 2020 19:35:01 GMT"
],
"Server": [
"nginx/1.15.6"
Expand Down
30 changes: 15 additions & 15 deletions tests/cassettes/dataset.json

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions tests/cassettes/get_analysis.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"http_interactions": [
{
"recorded_at": "2020-01-10T19:38:50",
"recorded_at": "2020-01-24T19:39:57",
"request": {
"body": {
"encoding": "utf-8",
Expand All @@ -15,7 +15,7 @@
"gzip, deflate"
],
"Authorization": [
"JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NzkyODk2NjcsImlhdCI6MTU3ODY4NDg2NywibmJmIjoxNTc4Njg0ODY3LCJpZGVudGl0eSI6MX0.mBIekUDEYBfJyFh3sSLnXm9EX1PJeBe_zFvRLrA1UMI"
"JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1ODA0OTkzMDEsImlhdCI6MTU3OTg5NDUwMSwibmJmIjoxNTc5ODk0NTAxLCJpZGVudGl0eSI6MX0.-vuaHxl4z9VE3-FJiRcUfF2NKrKP8SrnZVGXPTuw1uo"
],
"Connection": [
"keep-alive"
Expand All @@ -25,11 +25,11 @@
]
},
"method": "GET",
"uri": "https://neuroscout.org/api/analyses/MPKV4"
"uri": "https://neuroscout.org/api/analyses/wkKl6"
},
"response": {
"body": {
"base64_string": "H4sIAAAAAAAAA42RT0vDQBDF736MOaeSxH81N7EIohVpgwhSwjSZ2rXJZtmdLYTQ7+5s04oeCt523+z89s2bHvIZZMn5VQSlJWSqCmTIII3TeBQnoyTOk9vsAiKokNERF6qCTF5X5EqrDKtWQ6Z9XUewRrfel2H6+vR2KT11W25IhBXWjiJo2opqyHp41MZzOMz98otKOX5AOoZFBDm6TQCQrZWetltFsIvgBRsS1XRMjgvUWHdOOflgzmScdPdw32q26DjchDPxTdP90nrIOxMYHHjPtA1GYOa1QKZHW+/Bx9KqzzVrcg4W8jS3qN2qtQ2GUff0XdT/kz8ZMoNdIMn0aqVOB6xPDWnQkh6CH4I2lipVHvwA/AitDf6S9CYdL4KotrJQyNh6Cd96PVSvpeYY2YfmyezuIReC88tG8XH9wzfifVMcXP1ZyNk3UJ/jvDYCAAA=",
"base64_string": "H4sIAAAAAAAAA42RQU/DMAyF7/wMnzu0FhijN8SEhGActh6Q0FRlrcdC07SKnaGq2n/HWTcEh0nckuf4y/NzD9kC0vjyJoLCoWIsc8WQQjJOxqNxPEqus/guvYIISsWKkHNdQiqvS6TC6ZZ1YyG13pgItoq2hzJ8Vc9mIj2mKSoUYaMMYQR1U6KBtIcn23oOh6Vff2Ihx3dIprCKIFNUCWCOzmg7b3YaYR/Bq6pR1LZjJM6VVaYjTfLBkrEl6e7hobHsFHG4CWfm67r7pfWQdW1gcOC94C4YgYW3ApmfbL0FH2unP7ZskQhW8jRzytKmcbUKox7o+6j/J382ZAb7QJLp9UafD9ieG7JVDu0Q/BB067DUxdEPwI/QuOAvTm6T6SqIeicLhZSdl/Cdt0N1IjVixT40zxb3j5kQyK9rzaf1D9+I9yo/uvqzkItv+DoNljYCAAA=",
"encoding": null,
"string": ""
},
Expand All @@ -47,7 +47,7 @@
"application/json"
],
"Date": [
"Fri, 10 Jan 2020 19:38:50 GMT"
"Fri, 24 Jan 2020 19:39:57 GMT"
],
"Server": [
"nginx/1.15.6"
Expand Down Expand Up @@ -75,7 +75,7 @@
"code": 200,
"message": "OK"
},
"url": "https://neuroscout.org/api/analyses/MPKV4"
"url": "https://neuroscout.org/api/analyses/wkKl6"
}
}
],
Expand Down
8 changes: 4 additions & 4 deletions tests/cassettes/get_dataset.json

Large diffs are not rendered by default.

Loading

0 comments on commit 50635ca

Please sign in to comment.