Skip to content

Commit 71646b0

Browse files
authored
Merge pull request #110 from alpacahq/feature/oauth-support
Add OAuth authentication method
2 parents ee06988 + d95978d commit 71646b0

File tree

4 files changed

+19
-13
lines changed

4 files changed

+19
-13
lines changed

alpaca_trade_api/common.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,25 @@ def get_data_url():
1111
'APCA_API_DATA_URL', 'https://data.alpaca.markets').rstrip('/')
1212

1313

14-
def get_credentials(key_id=None, secret_key=None):
14+
def get_credentials(key_id=None, secret_key=None, oauth=None):
15+
oauth = oauth or os.environ.get('APCA_API_OAUTH_TOKEN')
16+
1517
key_id = key_id or os.environ.get('APCA_API_KEY_ID')
16-
if key_id is None:
18+
if key_id is None and oauth is None:
1719
raise ValueError('Key ID must be given to access Alpaca trade API',
1820
' (env: APCA_API_KEY_ID)')
1921

2022
secret_key = secret_key or os.environ.get('APCA_API_SECRET_KEY')
21-
if secret_key is None:
23+
if secret_key is None and oauth is None:
2224
raise ValueError('Secret key must be given to access Alpaca trade API'
2325
' (env: APCA_API_SECRET_KEY')
2426

25-
return key_id, secret_key
27+
return key_id, secret_key, oauth
2628

2729

2830
def get_polygon_credentials(alpaca_key=None):
2931
try:
30-
alpaca_key, _ = get_credentials(alpaca_key, 'ignored')
32+
alpaca_key, _, _ = get_credentials(alpaca_key, 'ignored')
3133
except ValueError:
3234
pass
3335
key_id = os.environ.get('POLYGON_KEY_ID') or alpaca_key

alpaca_trade_api/rest.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,11 @@ def __init__(
5959
key_id=None,
6060
secret_key=None,
6161
base_url=None,
62-
api_version=None
62+
api_version=None,
63+
oauth=None
6364
):
64-
self._key_id, self._secret_key = get_credentials(key_id, secret_key)
65+
self._key_id, self._secret_key, self._oauth = get_credentials(
66+
key_id, secret_key, oauth)
6567
self._base_url = base_url or get_base_url()
6668
self._api_version = get_api_version(api_version)
6769
self._session = requests.Session()
@@ -83,10 +85,12 @@ def _request(
8385
base_url = base_url or self._base_url
8486
version = api_version if api_version else self._api_version
8587
url = base_url + '/' + version + path
86-
headers = {
87-
'APCA-API-KEY-ID': self._key_id,
88-
'APCA-API-SECRET-KEY': self._secret_key,
89-
}
88+
headers = {}
89+
if self._oauth:
90+
headers['Authorization'] = 'Bearer ' + self._oauth
91+
else:
92+
headers['APCA-API-KEY-ID'] = self._key_id
93+
headers['APCA-API-SECRET-KEY'] = self._secret_key
9094
opts = {
9195
'headers': headers,
9296
# Since we allow users to set endpoint URL via env var,

alpaca_trade_api/stream.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class StreamConn(object):
99
'''Deprecated. Use stream2.StreamConn'''
1010

1111
def __init__(self, key_id=None, secret_key=None, base_url=None):
12-
self._key_id, self._secret_key = get_credentials(key_id, secret_key)
12+
self._key_id, self._secret_key, _ = get_credentials(key_id, secret_key)
1313
base_url = re.sub(r'^http', 'ws', base_url or get_base_url())
1414
self._endpoint = base_url + '/stream'
1515
self._handlers = {}

alpaca_trade_api/stream2.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
class StreamConn(object):
1212
def __init__(self, key_id=None, secret_key=None, base_url=None):
13-
self._key_id, self._secret_key = get_credentials(key_id, secret_key)
13+
self._key_id, self._secret_key, _ = get_credentials(key_id, secret_key)
1414
base_url = re.sub(r'^http', 'ws', base_url or get_base_url())
1515
self._endpoint = base_url + '/stream'
1616
self._handlers = {}

0 commit comments

Comments
 (0)