diff --git a/pydusken/__init__.py b/pydusken/__init__.py index 7a58e57..c09064c 100644 --- a/pydusken/__init__.py +++ b/pydusken/__init__.py @@ -28,8 +28,8 @@ class DuskenApi(object): def authenticate(self, username='', password=''): try: - self.oauth2_access_token = self.get_access_token(username, password, scope='write') - self.access_token = self.oauth2_access_token['access_token'] + self.oauth2_access_token = self.get_access_token(username, password, scope='read+write') + self.access_token = self.oauth2_access_token except requests.exceptions.HTTPError as e: logging.error("Could not authenticate with API. Correct client_id, client_secret, username and password?\n{0}".format(e)) return None diff --git a/pydusken/authentication.py b/pydusken/authentication.py index 09856d7..73e4c7e 100644 --- a/pydusken/authentication.py +++ b/pydusken/authentication.py @@ -11,6 +11,8 @@ from models import DuskenAccessToken class DuskenBackend(object): """ Django Authentication Backend + + TODO: permission methods: get_group_permissions(), get_all_permissions(), has_perm(), and has_module_perms() """ def __init__(self): @@ -29,6 +31,25 @@ class DuskenBackend(object): except ValidationError as e: return False + def _get_or_create_local_user(self, username): + try: + user = User.objects.get(username=username) + except User.DoesNotExist: + # if user does not exist, create a local user + user = User(username=username) + user.set_unusable_password() + user.save() + + return user + + def _refresh_access_token(self, user, access_token): + print "lol" + try: + d = DuskenAccessToken(user=user, **access_token) + d.save() + except Exception as e: + print e + def _sync_user_detail(self, user): me = self._api.members.me()['objects'][0] attrs = ['email', 'first_name', 'last_name'] @@ -36,48 +57,66 @@ class DuskenBackend(object): user.save() def authenticate(self, username=None, password=None): - # TODO you are here - # Check the username/password and return a User. Username can be an email - is_using_email = self._is_using_email(username) try: - if is_using_email: - access_token = self._api.authenticate(email=username, password=password) - else: - access_token = self._api.authenticate(username=username, password=password) - - if not access_token: - return None - - try: - if is_using_email: - user = User.objects.get(email=username) - else: - user = User.objects.get(username=username) - - try: - # Try refreshing access token - if user.duskenaccesstoken.access_token != access_token: - user.duskenaccesstoken.access_token = access_token=access_token - user.save() - except: - # ..create if not - d = DuskenAccessToken(access_token=access_token, user=user) - d.save() - except User.DoesNotExist: - # if user does not exist, create a local user - user = User(username=username) - user.set_unusable_password() - user.save() - DuskenAccessToken.objects.create(access_token=access_token['access_token'], user=user) - - self._sync_user_detail(user) - - return user - + access_token = self._api.authenticate(username=username, password=password) except HTTPError as e: # Did not authenticate - pass - return None + return None + + if not access_token: + return None + + user = self._get_or_create_local_user(username) + + self._refresh_access_token(user, access_token) + + self._sync_user_detail(user) + + return user + + #def authenticate(self, username=None, password=None): + # # TODO you are here + # # Check the username/password and return a User. Username can be an email + # is_using_email = self._is_using_email(username) + # try: + # if is_using_email: + # access_token = self._api.authenticate(email=username, password=password) + # else: + # access_token = self._api.authenticate(username=username, password=password) + + # if not access_token: + # return None + + # try: + # if is_using_email: + # user = User.objects.get(email=username) + # else: + # user = User.objects.get(username=username) + + # try: + # # Try refreshing access token + # if user.duskenaccesstoken.access_token != access_token: + # user.duskenaccesstoken.access_token = access_token=access_token + # user.save() + # except: + # # ..create if not + # d = DuskenAccessToken(access_token=access_token, user=user) + # d.save() + # except User.DoesNotExist: + # # if user does not exist, create a local user + # user = User(username=username) + # user.set_unusable_password() + # user.save() + # DuskenAccessToken.objects.create(access_token=access_token['access_token'], user=user) + + # self._sync_user_detail(user) + + # return user + + # except HTTPError as e: + # # Did not authenticate + # pass + # return None def get_user(self, user_id): try: diff --git a/pydusken/models.py b/pydusken/models.py index c96c608..bd27a0a 100644 --- a/pydusken/models.py +++ b/pydusken/models.py @@ -2,8 +2,10 @@ from django.db import models from django.contrib.auth.models import User class DuskenAccessToken(models.Model): - # TODO add refresh_token and expires access_token = models.CharField(max_length=255) + refresh_token = models.CharField(max_length=255) + expires_in = models.IntegerField() + scope = models.CharField(max_length=255) user = models.OneToOneField(User) def __unicode__(self):