From 5b17dedcad5fa392798fa56daf5d1db8f1d20841 Mon Sep 17 00:00:00 2001 From: Sorrel Bri Date: Sun, 6 Oct 2019 13:44:38 -0700 Subject: [PATCH 1/2] implement auth with username --- app.py | 3 ++- auth/auth.py | 57 +++++++++++++++++++++++++++++--------------------- models/User.py | 24 +++++++++++---------- 3 files changed, 48 insertions(+), 36 deletions(-) diff --git a/app.py b/app.py index e2c5604..4a7d7c9 100644 --- a/app.py +++ b/app.py @@ -10,7 +10,8 @@ from flask_cors import CORS def create_app(): 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.from_object(DevelopmentConfig) db.init_app(app) diff --git a/auth/auth.py b/auth/auth.py index b199d24..af58cc6 100644 --- a/auth/auth.py +++ b/auth/auth.py @@ -10,33 +10,42 @@ def auth_signup(): data = request.get_json() user = User.query.filter_by(email=data.get('email')).first() if not user: - try: - print('getting here 1') - user = User( - email = data['email'], - password = data['password'], - ) - print('getting here 2') - db.session.add(user) - print('wtf') - db.session.commit() - print('user') - auth_token = user.encode_auth_token(user.id) - print('getting here 4') - response = { - 'status': 'success', - 'message': 'Succesfully registered.', - 'auth_token': auth_token.decode() - } - return jsonify(response), 201 - except Exception as e: - print(e.__dict__) + user = User.query.filter_by(username=data.get('username')).first() + if not user: + try: + print('getting here 1') + print(data) + user = User( + username = data['username'], + email = data['email'], + password = data['password'], + ) + print('getting here 2') + db.session.add(user) + print('wtf') + db.session.commit() + print('user') + auth_token = user.encode_auth_token(user.id) + print('getting here 4') + response = { + 'status': 'success', + 'message': 'Succesfully registered.', + 'auth_token': auth_token.decode() + } + return jsonify(response), 201 + except Exception as e: + print(e.__dict__) + response = { + 'status': 'fail', + 'message': 'There was an error. Please try again.' + } + return jsonify(response), 401 + else: # username is taken response = { 'status': 'fail', - 'message': 'There was an error. Please try again.' + 'message': 'User already exists. Please login.' } - return jsonify(response), 401 - else: + else: # email is taken response = { 'status': 'fail', 'message': 'User already exists. Please login.' diff --git a/models/User.py b/models/User.py index 33a61d2..3fd732d 100644 --- a/models/User.py +++ b/models/User.py @@ -1,8 +1,10 @@ from database import db, ma +from marshmallow import fields from app import bcrypt from configuration import config import datetime import enum +import json import jwt class Ranks(enum.Enum): # with minimal Elo rating @@ -58,7 +60,9 @@ class User(db.Model): elo = db.Column(db.Integer) 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.email = email self.password = bcrypt.generate_password_hash( @@ -103,16 +107,14 @@ class User(db.Model): return 'Invalid token. Please log in again.' class UserSchema(ma.ModelSchema): - class Meta: - fields = ( - 'id', - 'username', - 'email', - 'registered_on', - 'rank', - 'rank_certainty', - 'elo' - ) + id = fields.Int() + username = fields.Str() + email = fields.Str() + registered_on = fields.Date() + rank = fields.Str() + rank_certainty = fields.Bool() + elo = fields.Int() + user_schema = UserSchema() users_schema = UserSchema(many=True) \ No newline at end of file From 8dcb80e456aa3361cf8ba5a3a6028d745b3a828f Mon Sep 17 00:00:00 2001 From: Sorrel Bri Date: Sun, 6 Oct 2019 15:39:22 -0700 Subject: [PATCH 2/2] setup login --- auth/auth.py | 32 +++++++++++++++++++++++--------- models/User.py | 5 +++-- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/auth/auth.py b/auth/auth.py index af58cc6..085ded3 100644 --- a/auth/auth.py +++ b/auth/auth.py @@ -1,5 +1,4 @@ from flask import Blueprint, request, jsonify, session - from database import db from models.User import User @@ -13,20 +12,14 @@ def auth_signup(): user = User.query.filter_by(username=data.get('username')).first() if not user: try: - print('getting here 1') - print(data) user = User( username = data['username'], email = data['email'], password = data['password'], ) - print('getting here 2') db.session.add(user) - print('wtf') db.session.commit() - print('user') auth_token = user.encode_auth_token(user.id) - print('getting here 4') response = { 'status': 'success', 'message': 'Succesfully registered.', @@ -54,5 +47,26 @@ def auth_signup(): @auth.route('/login', methods=['POST']) def auth_login(): - response = {"message": "login post"} - return jsonify(response) \ No newline at end of file + # get the post data + 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 \ No newline at end of file diff --git a/models/User.py b/models/User.py index 3fd732d..12ca239 100644 --- a/models/User.py +++ b/models/User.py @@ -6,6 +6,7 @@ import datetime import enum import json import jwt +import os class Ranks(enum.Enum): # with minimal Elo rating D7 = "Seven Dan" # Elo 2700+ @@ -85,7 +86,7 @@ class User(db.Model): } return jwt.encode( payload, - app.config.get('SECRET_KEY'), + os.environ.get('SECRET_KEY'), algorithm='HS256' ) except Exception as e: @@ -99,7 +100,7 @@ class User(db.Model): :return: integer|string """ try: - payload = jwt.decode(auth_token, app.config.get('SECRET_KEY')) + payload = jwt.decode(auth_token, os.environ.get('SECRET_KEY')) return payload['sub'] except jwt.ExpiredSignatureError: return 'Signature expired. Please log in again.'