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
@ -9,20 +8,18 @@ auth = Blueprint('auth', __name__, url_prefix='/auth')
def auth_signup(): 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:
user = User.query.filter_by(username=data.get('username')).first()
if not user: if not user:
try: try:
print('getting here 1')
user = User( user = User(
username = data['username'],
email = data['email'], email = data['email'],
password = data['password'], password = data['password'],
) )
print('getting here 2')
db.session.add(user) db.session.add(user)
print('wtf')
db.session.commit() db.session.commit()
print('user')
auth_token = user.encode_auth_token(user.id) auth_token = user.encode_auth_token(user.id)
print('getting here 4')
response = { response = {
'status': 'success', 'status': 'success',
'message': 'Succesfully registered.', 'message': 'Succesfully registered.',
@ -36,7 +33,12 @@ def auth_signup():
'message': 'There was an error. Please try again.' 'message': 'There was an error. Please try again.'
} }
return jsonify(response), 401 return jsonify(response), 401
else: else: # username is taken
response = {
'status': 'fail',
'message': 'User already exists. Please login.'
}
else: # email is taken
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)