]> jfr.im git - z_archive/twitter.git/blobdiff - twitter/oauth2.py
Improve OAuth2 app-only code and documentation
[z_archive/twitter.git] / twitter / oauth2.py
index a71bab125e050de540be5548e00a5156d4f0aab3..9b4d8466a676b28f37629391e40220c698ed4838 100644 (file)
@@ -1,17 +1,20 @@
 """
-Visit the Twitter developer page and create a new application:
+Twitter only supports the application-only flow of OAuth2 for certain
+API endpoints. This OAuth2 authenticator only supports the application-only
+flow right now.
+
+To authenticate with OAuth2, visit the Twitter developer page and create a new
+application:
 
     https://dev.twitter.com/apps/new
 
 This will get you a CONSUMER_KEY and CONSUMER_SECRET.
 
-Twitter only supports the application-only flow of OAuth2 for certain
-API endpoints. This OAuth2 authenticator only supports the application-only
-flow right now. If twitter supports OAuth2 for other endpoints, this
-authenticator may be modified as needed.
+Exchange your CONSUMER_KEY and CONSUMER_SECRET for a bearer token using the
+oauth2_dance function.
 
-Finally, you can use the OAuth2 authenticator to connect to Twitter. In
-code it all goes like this::
+Finally, you can use the OAuth2 authenticator and your bearer token to connect
+to Twitter. In code it goes like this::
 
     twitter = Twitter(auth=OAuth2(bearer_token=BEARER_TOKEN))
 
@@ -30,6 +33,20 @@ except ImportError:
 from base64 import b64encode
 from .auth import Auth
 
+def write_bearer_token_file(filename, oauth2_bearer_token):
+    """
+    Write a token file to hold the oauth2 bearer token.
+    """
+    oauth_file = open(filename, 'w')
+    print(oauth2_bearer_token, file=oauth_file)
+    oauth_file.close()
+
+def read_bearer_token_file(filename):
+    """
+    Read a token file and return the oauth2 bearer token.
+    """
+    f = open(filename)
+    return f.readline().strip()
 
 class OAuth2(Auth):
     """
@@ -42,22 +59,16 @@ class OAuth2(Auth):
         consumer_secret if you are requesting a bearer_token. Otherwise
         you must supply the bearer_token.
         """
-        self.bearer_token = None
-        self.consumer_key = None
-        self.consumer_secret = None
-
-        if bearer_token:
-            self.bearer_token = bearer_token
-        elif consumer_key and consumer_secret:
-            self.consumer_key = consumer_key
-            self.consumer_secret = consumer_secret
-        else:
+        self.bearer_token = bearer_token
+        self.consumer_key = consumer_key
+        self.consumer_secret = consumer_secret
+
+        if not (bearer_token or (consumer_key and consumer_secret)):
             raise MissingCredentialsError(
                 'You must supply either a bearer token, or both a '
                 'consumer_key and a consumer_secret.')
 
     def encode_params(self, base_url, method, params):
-
         return urlencode(params)
 
     def generate_headers(self):
@@ -66,25 +77,18 @@ class OAuth2(Auth):
                 b'Authorization': 'Bearer {0}'.format(
                     self.bearer_token).encode('utf8')
             }
-
-        elif self.consumer_key and self.consumer_secret:
-
+        else:
             headers = {
                 b'Content-Type': (b'application/x-www-form-urlencoded;'
                                   b'charset=UTF-8'),
-                b'Authorization': 'Basic {0}'.format(
-                    b64encode('{0}:{1}'.format(
+                b'Authorization': 'Basic {}'.format(
+                    b64encode('{}:{}'.format(
                         quote(self.consumer_key),
                         quote(self.consumer_secret)).encode('utf8')
                     ).decode('utf8')
                 ).encode('utf8')
             }
-
-        else:
-            raise MissingCredentialsError(
-                'You must supply either a bearer token, or both a '
-                'consumer_key and a consumer_secret.')
-
+        print(headers)
         return headers