Skip to content

Commit

Permalink
Add a backend for Classlink.
Browse files Browse the repository at this point in the history
  • Loading branch information
youcandanch committed Apr 7, 2016
1 parent 6fa5e7c commit e95ce61
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 1 deletion.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ nosetests.xml
.project
.pydevproject

# PyCharm
.idea/

test.db
local_settings.py
sessions/
Expand Down
44 changes: 44 additions & 0 deletions social/backends/classlink.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
from social.backends.oauth import BaseOAuth2


class ClasslinkOAuth(BaseOAuth2):
"""
Classlink OAuth authentication backend.
Docs: https://developer.classlink.com/docs/oauth2-workflow
"""
name = 'classlink'
AUTHORIZATION_URL = 'https://launchpad.classlink.com/oauth2/v2/auth'
ACCESS_TOKEN_URL = 'https://launchpad.classlink.com/oauth2/v2/token'
ACCESS_TOKEN_METHOD = 'POST'
DEFAULT_SCOPE = ['profile']
REDIRECT_STATE = False
SCOPE_SEPARATOR = ' '

def get_user_id(self, details, response):
"""Return user unique id provided by service"""
return response['UserId']

def get_user_details(self, response):
"""Return user details from Classlink account"""
fullname, first_name, last_name = self.get_user_names(
first_name=response.get('FirstName'),
last_name=response.get('LastName')
)

return {
'username': response.get('Email') or response.get('LoginId'),
'email': response.get('Email'),
'fullname': fullname,
'first_name': first_name,
'last_name': last_name,
}

def user_data(self, token, *args, **kwargs):
"""Loads user data from service"""
url = 'https://nodeapi.classlink.com/v2/my/info'
auth_header = {"Authorization": "Bearer %s" % token}
try:
return self.get_json(url, headers=auth_header)
except ValueError:
return None
3 changes: 2 additions & 1 deletion social/storage/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,8 @@ def expiration_datetime(self):

def set_extra_data(self, extra_data=None):
if extra_data and self.extra_data != extra_data:
if self.extra_data and not isinstance(self.extra_data, str):
if self.extra_data and not isinstance(
self.extra_data, six.string_types):
self.extra_data.update(extra_data)
else:
self.extra_data = extra_data
Expand Down

0 comments on commit e95ce61

Please sign in to comment.