[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