Skip to content
This repository was archived by the owner on Jan 11, 2018. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 19 additions & 2 deletions blockchainauth/auth_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,11 @@
:license: MIT, see LICENSE for more details.
"""

import uuid
from jwt import DecodeError
import requests
import requests.exceptions
import time
import uuid
from cryptography.hazmat.backends import default_backend
from pybitcoin import BitcoinPrivateKey
from blockchainauth.auth_message import AuthMessage
Expand All @@ -31,7 +34,7 @@ class AuthRequest(AuthMessage):
]

def __init__(self, private_key, domain_name, manifest_uri=None, redirect_uri=None,
scopes=None, expires_after=None, crypto_backend=default_backend()):
scopes=None, expires_after=None, crypto_backend=default_backend(), **kwargs):
""" private_key should be provided in HEX, WIF or binary format
domain_name should be a valid domain
manifest_uri should be a valid URI
Expand Down Expand Up @@ -79,5 +82,19 @@ def _payload(self):
payload['iss'] = make_did_from_address(address)
return payload

@classmethod
def fetch_app_manifest(cls, token):
# decode the token
try:
decoded_token = cls.decode(token)
except DecodeError:
return None

try:
return requests.get(decoded_token['payload']['manifest_uri']).json()
except (requests.exceptions.RequestException, ValueError):
# ValueError for non-json responses
return None

def redirect_url(self):
return 'blockstack:' + self.token()
29 changes: 25 additions & 4 deletions blockchainauth/verification.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,15 @@
"""

import requests
import requests.exceptions
import time
import traceback
from pybitcoin import BitcoinPublicKey
from blockchainauth.dids import get_address_from_did

NAME_LOOKUP_URL = 'https://explorer-api.appartisan.com/get_name_blockchain_record/'
LOCALHOST_CORE_API = 'http://localhost:6270'
EXTERNAL_CORE_API = 'https://core.blockstack.org'
NAME_LOOKUP_URL = '/v1/names/'


def do_signatures_match_public_keys(token, tokenizer, decoded_token):
Expand Down Expand Up @@ -55,14 +58,32 @@ def do_public_keys_match_username(token, tokenizer, decoded_token):
traceback.print_exc()
return False

if not payload.get('username', None) or not NAME_LOOKUP_URL:
if not payload.get('username', None):
return True

username = payload['username']
url = NAME_LOOKUP_URL.rstrip('/') + '/' + username

# get publicly available address and address from payload
response = requests.get(url).json()
# first try from localhost
url = LOCALHOST_CORE_API + NAME_LOOKUP_URL + username
try:
response = requests.get(url).json()
except (requests.exceptions.RequestException, ValueError):
# ValueError for non-json responses
response = None

# if failed try from public Core API
if not response:
url = EXTERNAL_CORE_API + NAME_LOOKUP_URL + username
try:
response = requests.get(url).json()
except (requests.exceptions.RequestException, ValueError):
# ValueError for non-json responses
response = None

if not response:
return False

try:
address_from_issuer = get_address_from_did(payload.get('iss', ''))
except ValueError:
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

setup(
name='blockchainauth',
version='0.3.1',
version='0.3.2',
url='https://github.com/blockstack/blockchain-auth-python',
license='MIT',
author='Blockstack Developers',
Expand Down
4 changes: 2 additions & 2 deletions tests/unit_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
REQUEST_SAMPLE_ENCODED_TOKEN, REQUEST_SAMPLE_DECODED_TOKEN,\
RESPONSE_SAMPLE_ENCODED_TOKEN, RESPONSE_SAMPLE_DECODED_TOKEN, RYAN_PROFILE
from blockchainauth.tokenizer import Tokenizer
from blockchainauth.verification import do_public_keys_match_username, NAME_LOOKUP_URL
from blockchainauth.verification import do_public_keys_match_username, LOCALHOST_CORE_API, NAME_LOOKUP_URL


class AuthRequestTest(unittest.TestCase):
Expand Down Expand Up @@ -96,7 +96,7 @@ def test_auth_response_token_encoding(self):

# with username
with requests_mock.mock() as m:
m.get(NAME_LOOKUP_URL.rstrip('/') + '/' + self.username,
m.get(LOCALHOST_CORE_API + NAME_LOOKUP_URL + self.username,
text=json.dumps({'address': self.public_key.address()}))
auth_response = AuthResponse(self.private_key_hex, RYAN_PROFILE, self.username)
auth_response_token = auth_response.token()
Expand Down