Skip to content

Commit

Permalink
Merge pull request #161 from MasoniteFramework/add-features-to-auth
Browse files Browse the repository at this point in the history
added several methods to auth class
  • Loading branch information
josephmancuso committed Jun 2, 2018
2 parents ffd6ec5 + 0423b72 commit 08fb5e3
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 10 deletions.
32 changes: 26 additions & 6 deletions masonite/facades/Auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ class Auth:
"""
This class will be used to authenticate users based on the config/auth.py file
"""

_once = False

def __init__(self, request, auth_model=None):
self.request = request
Expand Down Expand Up @@ -36,16 +38,17 @@ def user(self):
def login(self, name, password):
"""
Login the user based on the parameters provided
"""
"""
auth_column = self.auth_model.__auth__
try:
model = self.auth_model.where(auth_column, name).first()

if model and bcrypt.checkpw(bytes(password, 'utf-8'), bytes(model.password, 'utf-8')):
remember_token = str(uuid.uuid4())
model.remember_token = remember_token
model.save()
self.request.cookie('token', remember_token)
if not self._once:
remember_token = str(uuid.uuid4())
model.remember_token = remember_token
model.save()
self.request.cookie('token', remember_token)
return model

except Exception as exception:
Expand All @@ -54,5 +57,22 @@ def login(self, name, password):
return False

def logout(self):
self.request.cookie('token', '; expires=Thu, 01 Jan 1970 00:00:00 GMT', False)
self.request.delete_cookie('token')
return self

def login_by_id(self, id):
model = self.auth_model.find(id)

if model:
if not self._once:
remember_token = str(uuid.uuid4())
model.remember_token = remember_token
model.save()
self.request.cookie('token', remember_token)
return model

return False

def once(self):
self._once = True
return self
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
'masonite.contracts',
'masonite.helpers',
],
version='1.6.10',
version='1.6.11',
install_requires=[
'validator.py==1.2.5',
'cryptography==2.2.2',
Expand Down
61 changes: 58 additions & 3 deletions tests/test_auth.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,67 @@
from masonite.facades.Auth import Auth
from masonite.request import Request
from masonite.testsuite.TestSuite import generate_wsgi

class MockUser():

__auth__ = 'email'
password = '$2a$04$SXAMKoNuuiv7iO4g4U3ZOemyJJiKAHomUIFfGyH4hyo4LrLjcMqvS'
email = 'user@email.com'
id = 1

def where(self, column, name):
return self

def first(self):
return self

def save(self):
pass

def find(self, id):
if self.id == id:
return self
return False

class TestAuth:

def setup_method(self):
REQUEST = Request({})
self.request = Request(generate_wsgi())

self.AUTH = Auth(REQUEST, object)
self.auth = Auth(self.request, MockUser())

def test_auth(self):
assert self.AUTH
assert self.auth

def test_login_user(self):
assert isinstance(self.auth.login('user@email.com', 'secret'), MockUser)
assert self.request.get_cookie('token')

def test_get_user(self):
assert self.auth.login_by_id(1)
assert isinstance(self.auth.user(), MockUser)

def test_get_user_returns_false_if_not_loggedin(self):
self.auth.login('user@email.com', 'wrong_secret')
assert self.auth.user() is False

def test_logout_user(self):
assert isinstance(self.auth.login('user@email.com', 'secret'), MockUser)
assert self.request.get_cookie('token')

self.auth.logout()
assert not self.request.get_cookie('token')
assert not self.auth.user()

def test_login_user_fails(self):
assert self.auth.login('user@email.com', 'bad_password') is False

def test_login_by_id(self):
assert isinstance(self.auth.login_by_id(1), MockUser)
assert self.request.get_cookie('token')

assert self.auth.login_by_id(2) is False

def test_login_once_does_not_set_cookie(self):
assert isinstance(self.auth.once().login_by_id(1), MockUser)
assert self.request.get_cookie('token') is None

0 comments on commit 08fb5e3

Please sign in to comment.