Skip to content

Commit 4622972

Browse files
committed
Add option to pass Auth Key as base64 string
Pass the base64 encoded Auth Key string to TokenCredentials rather than the file path. This can be useful when the Auth Key is not stored in a file for security reasons.
1 parent aac4bd3 commit 4622972

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

apns2/credentials.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import time
22
from typing import Optional, Tuple, TYPE_CHECKING
3+
from base64 import b64decode
34

45
import jwt
56

@@ -43,9 +44,13 @@ def __init__(self, cert_file: Optional[str] = None, password: Optional[str] = No
4344
# Credentials subclass for JWT token based authentication
4445
class TokenCredentials(Credentials):
4546
def __init__(self, auth_key_path: str, auth_key_id: str, team_id: str,
47+
auth_key_base64: Optional[str] = None,
4648
encryption_algorithm: str = DEFAULT_TOKEN_ENCRYPTION_ALGORITHM,
4749
token_lifetime: int = DEFAULT_TOKEN_LIFETIME) -> None:
48-
self.__auth_key = self._get_signing_key(auth_key_path)
50+
if auth_key_base64 is not None:
51+
self.__auth_key = self._decode_signing_key(auth_key_base64)
52+
else:
53+
self.__auth_key = self._get_signing_key(auth_key_path)
4954
self.__auth_key_id = auth_key_id
5055
self.__team_id = team_id
5156
self.__encryption_algorithm = encryption_algorithm
@@ -71,6 +76,13 @@ def _get_signing_key(key_path: str) -> str:
7176
secret = f.read()
7277
return secret
7378

79+
@staticmethod
80+
def _decode_signing_key(key_base64: str) -> str:
81+
secret = ''
82+
if key_base64:
83+
secret = b64decode(key_base64).decode()
84+
return secret
85+
7486
def _get_or_create_topic_token(self) -> str:
7587
# dict of topic to issue date and JWT token
7688
token_pair = self.__jwt_token

test/test_credentials.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
# - timing out of the token
55
# - creating multiple tokens for different topics
66

7+
from base64 import b64encode
78
import pytest
89
from freezegun import freeze_time
910

@@ -21,6 +22,10 @@ def token_credentials():
2122
token_lifetime=30, # seconds
2223
)
2324

25+
def test_auth_key_base64():
26+
with open('test/eckey.pem', 'rb') as f:
27+
auth_key_base64 = b64encode(f.read()).decode()
28+
assert TokenCredentials._get_signing_key('test/eckey.pem') == TokenCredentials._decode_signing_key(auth_key_base64)
2429

2530
def test_token_expiration(token_credentials):
2631
with freeze_time('2012-01-14 12:00:00'):

0 commit comments

Comments
 (0)