From 57dba312abf77c60bf09725f22970e12a8da7da6 Mon Sep 17 00:00:00 2001 From: Benjamin Ramhorst <59868635+bo3z@users.noreply.github.com> Date: Fri, 4 Feb 2022 13:15:23 +0000 Subject: [PATCH 1/2] Added basic registration - not fully tested. Includes user verification, linking to device. --- app.py | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 61 insertions(+), 6 deletions(-) diff --git a/app.py b/app.py index abc57ef..b70d246 100644 --- a/app.py +++ b/app.py @@ -1,16 +1,71 @@ -from flask import Flask - -import firebase_admin -from firebase_admin import credentials -from firebase_admin import firestore +import json +from random import randint +from flask import Flask, request +from flask_mail import Mail +from firebase_admin import credentials, firestore, auth +# Initialize Flask app app = Flask(__name__) + +# Initalize Mail instance +app.config['MAIL_SERVER']='smtp.gmail.com' +app.config['MAIL_PORT'] = 465 +#app.config['MAIL_USERNAME'] = '' +#app.config['MAIL_PASSWORD'] = '' +app.config['MAIL_USE_TLS'] = False +app.config['MAIL_USE_SSL'] = True +mail = Mail(app) + +# Initialize Firebase firebase = firebase_admin.initialize_app(credentials.Certificate('firebase-key.json')) + @app.route('/') -def hello_world(): # put application's code here +def hello_world(): return 'Hello World! I am the dog you tracked with the amazing sensor from LEG industries...kidding this is just the home page :)' +@app.route('/auth/register', methods=['POST']): +def register(): + email = request.form.get('email') + password = request.form.get('email') + name = request.form.get('name') + deviceId = request.form.get('deviceid') + + # Some fields are not present + if email is None or password is None or name is None or deviceId is None: + return Response("{'error':'Entires missing'}", status=400, mimetype='application/json') + + # Register user with Firebase authentication + user = auth.create_user( + email=email + email_verified=False, + password=password, + display_name=name, + disabled=False) + + # Prompt the user to verify their email + code = randint(100000, 999999) + data = { + u'code': code + } + firestore.client().collection(u'verification').document(user.uid).set(code) + msg = Message('Please verify your email for BarkFinder', sender = 'TBA', recipients = [email]) + msg.body = '''Hey {}! Thank you for signing up for BarkFinder. + In order to use our sevices, could you please verify your email address by logging in and entering this code {}''' + .format(name, code) + mail.send(msg) + + # Link the user to the device + data = { + u'devices': [deviceId] + } + firestore.client().collection(u'devices').document(user.uid).set(data) + + # User succesfully created and linked to device + resp = {"uid":user.uid} + return Response(json.dumps(resp, 2), status=201, mimetype='application/json') + + # An example of reading data from Firebase # Taken from Firebase documentation @app.route('/example/read', methods=['GET']) From 7e234da82a7f82359b5f6bea585edc2cb0e6e02a Mon Sep 17 00:00:00 2001 From: Benjamin Ramhorst Date: Sun, 6 Feb 2022 11:45:29 +0000 Subject: [PATCH 2/2] Registration bug fixes --- app.py | 56 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/app.py b/app.py index b70d246..3f218bb 100644 --- a/app.py +++ b/app.py @@ -1,8 +1,10 @@ import json -from random import randint -from flask import Flask, request -from flask_mail import Mail +from random import randint +import firebase_admin +from flask import Flask, Response, request +from flask_mail import Mail, Message from firebase_admin import credentials, firestore, auth +from firebase_admin._auth_utils import EmailAlreadyExistsError # Initialize Flask app app = Flask(__name__) @@ -10,8 +12,8 @@ app = Flask(__name__) # Initalize Mail instance app.config['MAIL_SERVER']='smtp.gmail.com' app.config['MAIL_PORT'] = 465 -#app.config['MAIL_USERNAME'] = '' -#app.config['MAIL_PASSWORD'] = '' +app.config['MAIL_USERNAME'] = 'legbarkr@gmail.com' +app.config['MAIL_PASSWORD'] = '!Password123' app.config['MAIL_USE_TLS'] = False app.config['MAIL_USE_SSL'] = True mail = Mail(app) @@ -19,40 +21,46 @@ mail = Mail(app) # Initialize Firebase firebase = firebase_admin.initialize_app(credentials.Certificate('firebase-key.json')) - @app.route('/') def hello_world(): return 'Hello World! I am the dog you tracked with the amazing sensor from LEG industries...kidding this is just the home page :)' -@app.route('/auth/register', methods=['POST']): +@app.route('/auth/register', methods=['POST']) def register(): - email = request.form.get('email') - password = request.form.get('email') - name = request.form.get('name') - deviceId = request.form.get('deviceid') + body = request.json + + if body is None: + return Response("{'error':'Invalid request - please provide a body'}", status=400, mimetype='application/json') + + email = body['email'] + password = body['password'] + name = body['name'] + deviceId = body['deviceid'] # Some fields are not present if email is None or password is None or name is None or deviceId is None: - return Response("{'error':'Entires missing'}", status=400, mimetype='application/json') + return Response("{'error':'Entries missing'}", status=400, mimetype='application/json') # Register user with Firebase authentication - user = auth.create_user( - email=email - email_verified=False, - password=password, - display_name=name, - disabled=False) + try: + user = auth.create_user( + email=email, + email_verified=False, + password=password, + display_name=name, + disabled=False) + except EmailAlreadyExistsError: + return Response("{'error':'User with given email address already exists'}", status=409, mimetype='application/json') # Prompt the user to verify their email code = randint(100000, 999999) data = { u'code': code } - firestore.client().collection(u'verification').document(user.uid).set(code) + firestore.client().collection(u'verification').document(user.uid).set(data) msg = Message('Please verify your email for BarkFinder', sender = 'TBA', recipients = [email]) - msg.body = '''Hey {}! Thank you for signing up for BarkFinder. - In order to use our sevices, could you please verify your email address by logging in and entering this code {}''' - .format(name, code) + msg.body = '''Hey {}! Thank you for signing up for BarkFinder. + In order to use our sevices, could you please verify your email address by logging in and entering this code {}'''.format(name, code) mail.send(msg) # Link the user to the device @@ -61,9 +69,9 @@ def register(): } firestore.client().collection(u'devices').document(user.uid).set(data) - # User succesfully created and linked to device + # User successfully created and linked to device resp = {"uid":user.uid} - return Response(json.dumps(resp, 2), status=201, mimetype='application/json') + return Response(json.dumps(resp), status=201, mimetype='application/json') # An example of reading data from Firebase