Merge pull request #5 from sorrelbri/sj-auth

sj auth
This commit is contained in:
sorrelbri 2019-10-06 18:52:43 -07:00 committed by GitHub
commit 0028c40825
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 68 additions and 41 deletions

3
app.py
View file

@ -10,7 +10,8 @@ from flask_cors import CORS
def create_app(): def create_app():
app = Flask(__name__) app = Flask(__name__)
CORS(app, origins="http://localhost:3004") CORS(app, resources={r"/api/*": {"origins": "http://localhost:3000"},
r"/auth/*": {"origins": "http://localhost:3000"}})
app.config['CORS_HEADERS'] = 'Content-Type' app.config['CORS_HEADERS'] = 'Content-Type'
app.config.from_object(DevelopmentConfig) app.config.from_object(DevelopmentConfig)
db.init_app(app) db.init_app(app)

View file

@ -1,5 +1,4 @@
from flask import Blueprint, request, jsonify, session from flask import Blueprint, request, jsonify, session
from database import db from database import db
from models.User import User from models.User import User
@ -10,33 +9,36 @@ def auth_signup():
data = request.get_json() data = request.get_json()
user = User.query.filter_by(email=data.get('email')).first() user = User.query.filter_by(email=data.get('email')).first()
if not user: if not user:
try: user = User.query.filter_by(username=data.get('username')).first()
print('getting here 1') if not user:
user = User( try:
email = data['email'], user = User(
password = data['password'], username = data['username'],
) email = data['email'],
print('getting here 2') password = data['password'],
db.session.add(user) )
print('wtf') db.session.add(user)
db.session.commit() db.session.commit()
print('user') auth_token = user.encode_auth_token(user.id)
auth_token = user.encode_auth_token(user.id) response = {
print('getting here 4') 'status': 'success',
response = { 'message': 'Succesfully registered.',
'status': 'success', 'auth_token': auth_token.decode()
'message': 'Succesfully registered.', }
'auth_token': auth_token.decode() return jsonify(response), 201
} except Exception as e:
return jsonify(response), 201 print(e.__dict__)
except Exception as e: response = {
print(e.__dict__) 'status': 'fail',
'message': 'There was an error. Please try again.'
}
return jsonify(response), 401
else: # username is taken
response = { response = {
'status': 'fail', 'status': 'fail',
'message': 'There was an error. Please try again.' 'message': 'User already exists. Please login.'
} }
return jsonify(response), 401 else: # email is taken
else:
response = { response = {
'status': 'fail', 'status': 'fail',
'message': 'User already exists. Please login.' 'message': 'User already exists. Please login.'
@ -45,5 +47,26 @@ def auth_signup():
@auth.route('/login', methods=['POST']) @auth.route('/login', methods=['POST'])
def auth_login(): def auth_login():
response = {"message": "login post"} # get the post data
return jsonify(response) data = request.get_json()
try:
# fetch the user data
print('getting here')
user = User.query.filter_by(email=data['email']).first()
print(user.username)
auth_token = user.encode_auth_token(user.id)
print(auth_token)
if auth_token:
response = {
'status': 'success',
'message': 'Successfully logged in.',
'auth_token': auth_token.decode()
}
return jsonify(response), 200
except Exception as e:
print(e)
response = {
'status': 'fail',
'message': 'Try again'
}
return jsonify(response), 500

View file

@ -1,9 +1,12 @@
from database import db, ma from database import db, ma
from marshmallow import fields
from app import bcrypt from app import bcrypt
from configuration import config from configuration import config
import datetime import datetime
import enum import enum
import json
import jwt import jwt
import os
class Ranks(enum.Enum): # with minimal Elo rating class Ranks(enum.Enum): # with minimal Elo rating
D7 = "Seven Dan" # Elo 2700+ D7 = "Seven Dan" # Elo 2700+
@ -58,7 +61,9 @@ class User(db.Model):
elo = db.Column(db.Integer) elo = db.Column(db.Integer)
rank_certainty = db.Column(db.Boolean, nullable=False, default=False) rank_certainty = db.Column(db.Boolean, nullable=False, default=False)
def __init__(self, username, email, password, rank='RU', admin=False): def __init__(self, username, email, password, rank=Ranks.K1, admin=False):
print(rank)
print(Ranks)
self.username = username self.username = username
self.email = email self.email = email
self.password = bcrypt.generate_password_hash( self.password = bcrypt.generate_password_hash(
@ -81,7 +86,7 @@ class User(db.Model):
} }
return jwt.encode( return jwt.encode(
payload, payload,
app.config.get('SECRET_KEY'), os.environ.get('SECRET_KEY'),
algorithm='HS256' algorithm='HS256'
) )
except Exception as e: except Exception as e:
@ -95,7 +100,7 @@ class User(db.Model):
:return: integer|string :return: integer|string
""" """
try: try:
payload = jwt.decode(auth_token, app.config.get('SECRET_KEY')) payload = jwt.decode(auth_token, os.environ.get('SECRET_KEY'))
return payload['sub'] return payload['sub']
except jwt.ExpiredSignatureError: except jwt.ExpiredSignatureError:
return 'Signature expired. Please log in again.' return 'Signature expired. Please log in again.'
@ -103,16 +108,14 @@ class User(db.Model):
return 'Invalid token. Please log in again.' return 'Invalid token. Please log in again.'
class UserSchema(ma.ModelSchema): class UserSchema(ma.ModelSchema):
class Meta: id = fields.Int()
fields = ( username = fields.Str()
'id', email = fields.Str()
'username', registered_on = fields.Date()
'email', rank = fields.Str()
'registered_on', rank_certainty = fields.Bool()
'rank', elo = fields.Int()
'rank_certainty',
'elo'
)
user_schema = UserSchema() user_schema = UserSchema()
users_schema = UserSchema(many=True) users_schema = UserSchema(many=True)