Partial commit
This commit is contained in:
1 parent
6ee8b13f04
commit
3600df6f16
3 files changed
+83
-42
No files matched your search
@@ -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
|
||||
|
||||
+78
-39
@@ -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:
|
||||
|
||||
+3
-1
@@ -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):
|
||||
|
||||
Reference in new issue
Block a user