[Python-modules-commits] [python-social-auth] 41/322: Khan Academy oauth support now fully working

Wolfgang Borgert debacle at moszumanska.debian.org
Sat Dec 24 15:12:47 UTC 2016


This is an automated email from the git hooks/post-receive script.

debacle pushed a commit to tag v0.2.10
in repository python-social-auth.

commit bebef4ef7e1ada4bb029334a3e061e1c8a3fa283
Author: Anna Warzecha <anna.warzecha at gmail.com>
Date:   Tue Nov 18 23:23:05 2014 +0100

    Khan Academy oauth support now fully working
---
 social/backends/khanacademy.py | 91 ++++++++++++++++++++++++++++++++----------
 1 file changed, 70 insertions(+), 21 deletions(-)

diff --git a/social/backends/khanacademy.py b/social/backends/khanacademy.py
index 86fcd7d..0e76cc6 100644
--- a/social/backends/khanacademy.py
+++ b/social/backends/khanacademy.py
@@ -2,12 +2,75 @@
 Khan Academy OAuth backend, docs at:
     http://psa.matiasaguirre.net/docs/backends/facebook.html
 """
+import six
+
+from oauthlib.oauth1 import SIGNATURE_HMAC, SIGNATURE_TYPE_QUERY
+from requests_oauthlib import OAuth1
 
-from oauthlib.oauth1 import Client, SIGNATURE_HMAC, SIGNATURE_TYPE_QUERY
 from social.backends.oauth import BaseOAuth1
+from social.p3 import urlencode
+
+
+class BrowserBasedOAuth1(BaseOAuth1):
+    """Browser based mechanism OAuth authentication, fill the needed
+    parameters to communicate properly with authentication service.
+
+        REQUEST_TOKEN_URL       Request token URL (opened in web browser)
+        ACCESS_TOKEN_URL        Access token URL
+    """
+    REQUEST_TOKEN_URL = ''
+    OAUTH_TOKEN_PARAMETER_NAME = 'oauth_token'
+    REDIRECT_URI_PARAMETER_NAME = 'redirect_uri'
+    ACCESS_TOKEN_URL = ''
+
+    def auth_url(self):
+        """Return redirect url"""
+        return self.unauthorized_token_request()
+
+    def get_unauthorized_token(self):
+        return self.strategy.request_data()
+
+    def unauthorized_token_request(self):
+        """Return request for unauthorized token (first stage)"""
+
+        params = self.request_token_extra_arguments()
+        params.update(self.get_scope_argument())
+        key, secret = self.get_key_and_secret()
+        # decoding='utf-8' produces errors with python-requests on Python3
+        # since the final URL will be of type bytes
+        decoding = None if six.PY3 else 'utf-8'
+        state = self.get_or_create_state()
+        auth = OAuth1(
+            key,
+            secret,
+            callback_uri=self.get_redirect_uri(state),
+            decoding=decoding,
+            signature_method=SIGNATURE_HMAC,
+            signature_type=SIGNATURE_TYPE_QUERY
+        )
+        url = self.REQUEST_TOKEN_URL + '?' + urlencode(params)
+        url, _, _ = auth.client.sign(url)
+        return url
 
+    def oauth_auth(self, token=None, oauth_verifier=None):
+        key, secret = self.get_key_and_secret()
+        oauth_verifier = oauth_verifier or self.data.get('oauth_verifier')
+        token = token or {}
+        # decoding='utf-8' produces errors with python-requests on Python3
+        # since the final URL will be of type bytes
+        decoding = None if six.PY3 else 'utf-8'
+        state = self.get_or_create_state()
+        return OAuth1(key, secret,
+                      resource_owner_key=token.get('oauth_token'),
+                      resource_owner_secret=token.get('oauth_token_secret'),
+                      callback_uri=self.get_redirect_uri(state),
+                      verifier=oauth_verifier,
+                      signature_method=SIGNATURE_HMAC,
+                      signature_type=SIGNATURE_TYPE_QUERY,
+                      decoding=decoding)
 
-class KhanAcademyOAuth1(BaseOAuth1):
+
+class KhanAcademyOAuth1(BrowserBasedOAuth1):
     """
     Class used for autorising with Khan Academy.
 
@@ -40,25 +103,10 @@ class KhanAcademyOAuth1(BaseOAuth1):
     REQUEST_TOKEN_URL = 'http://www.khanacademy.org/api/auth/request_token'
     ACCESS_TOKEN_URL = 'https://www.khanacademy.org/api/auth/access_token'
     REDIRECT_URI_PARAMETER_NAME = 'oauth_callback'
-
-    def oauth_authorization_request(self, token):
-        """Generate OAuth request to authorize token."""
-        key, secret = self.get_key_and_secret()
-        state = self.get_or_create_state()
-        auth_client = Client(
-            key, secret,
-            signature_method=SIGNATURE_HMAC,
-            signature_type=SIGNATURE_TYPE_QUERY,
-            callback_uri=self.get_redirect_uri(state)
-        )
-        url, headers, body = auth_client.sign(self.REQUEST_TOKEN_URL)
-        return url
-
-    def get_unauthorized_token(self):
-        return self.strategy.request_data()
+    USER_DATA_URL = 'https://www.khanacademy.org/api/v1/user'
 
     def get_user_details(self, response):
-        """Return user details from Facebook account"""
+        """Return user details from Khan Academy account"""
         return {
             'username': response.get('key_email'),
             'email': response.get('key_email'),
@@ -70,5 +118,6 @@ class KhanAcademyOAuth1(BaseOAuth1):
 
     def user_data(self, access_token, *args, **kwargs):
         """Loads user data from service"""
-        return self.get_json('https://www.khanacademy.org/api/v1/user',
-                             auth=self.oauth_auth(access_token))
+        auth = self.oauth_auth(access_token)
+        url, _, _ = auth.client.sign(self.USER_DATA_URL)
+        return self.get_json(url)

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/python-social-auth.git



More information about the Python-modules-commits mailing list