Source code for pyetrade.authorization

"""Authorization - ETrade Authorization API Calls

   TODO:
    * Catch events

"""
import logging

from requests_oauthlib import OAuth1Session

# Set up logging
LOGGER = logging.getLogger(__name__)


[docs] class ETradeOAuth(object): """:description: Performs authorization for OAuth 1.0a :param consumer_key: Client key provided by Etrade :type consumer_key: str, required :param consumer_secret: Client secret provided by Etrade :type consumer_secret: str, required :param callback_url: Callback URL passed to OAuth mod, defaults to "oob" :type callback_url: str, optional :EtradeRef: https://apisb.etrade.com/docs/api/authorization/request_token.html """ def __init__( self, consumer_key: str, consumer_secret: str, callback_url: str = "oob" ): self.consumer_key = consumer_key self.consumer_secret = consumer_secret self.base_url_prod = r"https://api.etrade.com" self.base_url_dev = r"https://apisb.etrade.com" self.req_token_url = r"https://api.etrade.com/oauth/request_token" self.auth_token_url = r"https://us.etrade.com/e/t/etws/authorize" self.access_token_url = r"https://api.etrade.com/oauth/access_token" self.callback_url = callback_url self.access_token = None self.resource_owner_key = None
[docs] def get_request_token(self) -> str: """:description: Obtains the token URL from Etrade. :param None: Takes no parameters :return: Formatted Authorization URL (Access this to obtain taken) :rtype: str :EtradeRef: https://apisb.etrade.com/docs/api/authorization/request_token.html """ # Set up session self.session = OAuth1Session( self.consumer_key, self.consumer_secret, callback_uri=self.callback_url, signature_type="AUTH_HEADER", ) # get request token self.session.fetch_request_token(self.req_token_url) # get authorization url # etrade format: url?key&token authorization_url = self.session.authorization_url(self.auth_token_url) akey = self.session.parse_authorization_response(authorization_url) # store oauth_token self.resource_owner_key = akey["oauth_token"] formated_auth_url = "%s?key=%s&token=%s" % ( self.auth_token_url, self.consumer_key, akey["oauth_token"], ) LOGGER.debug(formated_auth_url) return formated_auth_url
[docs] def get_access_token(self, verifier: str) -> dict: """:description: Obtains access token. Requires token URL from :class:`get_request_token` :param verifier: OAuth Verification Code from Etrade :type verifier: str, required :return: OAuth access tokens :rtype: dict :EtradeRef: https://apisb.etrade.com/docs/api/authorization/get_access_token.html """ # Set verifier self.session._client.client.verifier = verifier # Get access token self.access_token = self.session.fetch_access_token(self.access_token_url) LOGGER.debug(self.access_token) return self.access_token
[docs] class ETradeAccessManager(object): """:description: Renews and revokes ETrade OAuth access tokens :param client_key: Client key provided by Etrade :type client_key: str, required :param client_secret: Client secret provided by Etrade :type client_secret: str, required :param resource_owner_key: Resource key from :class:`ETradeOAuth` :type resource_owner_key: str, required :param resource_owner_secret: Resource secret from :class:`ETradeOAuth` :type resource_owner_secret: str, required :EtradeRef: https://apisb.etrade.com/docs/api/authorization/renew_access_token.html """ def __init__( self, client_key: str, client_secret: str, resource_owner_key: str, resource_owner_secret: str, ): self.client_key = client_key self.client_secret = client_secret self.resource_owner_key = resource_owner_key self.resource_owner_secret = resource_owner_secret self.renew_access_token_url = r"https://api.etrade.com/oauth/renew_access_token" self.revoke_access_token_url = ( r"https://api.etrade.com/oauth/revoke_access_token" ) self.session = OAuth1Session( self.client_key, self.client_secret, self.resource_owner_key, self.resource_owner_secret, signature_type="AUTH_HEADER", )
[docs] def renew_access_token(self) -> bool: """:description: Renews access tokens obtained from :class:`ETradeOAuth` :param None: Takes no parameters :return: Success or failure :rtype: bool (True or False) :EtradeRef: https://apisb.etrade.com/docs/api/authorization/renew_access_token.html """ resp = self.session.get(self.renew_access_token_url) resp.raise_for_status() LOGGER.debug(resp.text) return True
[docs] def revoke_access_token(self) -> bool: """:description: Revokes access tokens obtained from :class:`ETradeOAuth` :param None: Takes no parameters :return: Success or failure :rtype: bool (True or False) :EtradeRef: https://apisb.etrade.com/docs/api/authorization/revoke_access_token.html """ resp = self.session.get(self.revoke_access_token_url) resp.raise_for_status() LOGGER.debug(resp.text) return True