fxa/plugins/requests.py (72 lines of code) (raw):

# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this file, # You can obtain one at http://mozilla.org/MPL/2.0/. import json import os from hashlib import sha256 from requests.auth import AuthBase from urllib.parse import urlparse from fxa.cache import MemoryCache from fxa.constants import PRODUCTION_URLS from fxa.tools.bearer import get_bearer_token FXA_ACCOUNT_URL = PRODUCTION_URLS['authentication'] FXA_OAUTH_URL = PRODUCTION_URLS['oauth'] DEFAULT_CACHE_EXPIRY = 3600 DEFAULT_CLIENT_ID = "5882386c6d801776" # Firefox dev Client ID def get_cache_key(*args): cache_key = sha256() for key in args: if key: cache_key.update(str(key).encode('utf-8')) cache_key.update(b'\n') return cache_key.hexdigest() class FxABearerTokenAuth(AuthBase): def __init__(self, email, password, scopes=None, client_id=None, account_server_url=FXA_ACCOUNT_URL, oauth_server_url=FXA_OAUTH_URL, cache=True, ttl=DEFAULT_CACHE_EXPIRY): self.email = email self.password = password if scopes is None: scopes = ['profile'] self.scopes = scopes self.client_id = client_id self.account_server_url = account_server_url self.oauth_server_url = oauth_server_url self.cache = cache if self.cache is True: self.cache = MemoryCache(ttl) def __call__(self, request): cache_key = get_cache_key( self.account_server_url, self.oauth_server_url, self.email, self.password, self.scopes, self.client_id) token = None if self.cache: token = self.cache.get(cache_key) if not token: token = get_bearer_token( self.email, self.password, self.scopes, client_id=self.client_id, account_server_url=self.account_server_url, oauth_server_url=self.oauth_server_url) if self.cache: self.cache.set(cache_key, token) request.headers["Authorization"] = "Bearer %s" % token return request # If httpie is installed, register the Firefox Account BearerToken plugin. try: from httpie.plugins import AuthPlugin except ImportError: pass else: # pragma: no cover class FxABearerTokenPlugin(AuthPlugin): name = 'Firefox Account Bearer Token Auth' auth_type = 'fxa-bearer' description = ('Generate a Bearer Token from ' 'a Firefox Account login/password') def get_auth(self, fxa_id, fxa_password): client_id = os.getenv("FXA_CLIENT_ID", DEFAULT_CLIENT_ID) scopes = os.getenv("FXA_SCOPES") account_server_url = os.getenv("FXA_ACCOUNT_SERVER_URL", FXA_ACCOUNT_URL) oauth_server_url = os.getenv("FXA_OAUTH_SERVER_URL", FXA_OAUTH_URL) if scopes: scopes = scopes.split() return FxABearerTokenAuth(fxa_id, fxa_password, scopes, client_id, account_server_url, oauth_server_url)