mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-08-19 05:59:44 -04:00
108537814: Implementation of 3 factor authentication.
The post register endpoint will send a random 5 digit code via sms and another via email. If either code fails to send, the user will not be created and the person can register again. The codes are saved to the session cookie, and expire in 1 hour. Another iteration of this story will save the codes to a database.
This commit is contained in:
5
app/main/exceptions.py
Normal file
5
app/main/exceptions.py
Normal file
@@ -0,0 +1,5 @@
|
||||
|
||||
|
||||
class AdminApiClientException(Exception):
|
||||
def __init__(self, message):
|
||||
self.value = message
|
||||
@@ -15,19 +15,16 @@ def govuk():
|
||||
|
||||
|
||||
@main.route("/register-from-invite")
|
||||
@login_required
|
||||
def registerfrominvite():
|
||||
return render_template('register-from-invite.html')
|
||||
|
||||
|
||||
@main.route("/verify")
|
||||
@login_required
|
||||
def verify():
|
||||
return render_template('verify.html')
|
||||
|
||||
|
||||
@main.route("/verify-mobile")
|
||||
@login_required
|
||||
def verifymobile():
|
||||
return render_template('verify-mobile.html')
|
||||
|
||||
@@ -50,7 +47,6 @@ def addservice():
|
||||
|
||||
|
||||
@main.route("/two-factor")
|
||||
@login_required
|
||||
def twofactor():
|
||||
return render_template('two-factor.html')
|
||||
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timedelta
|
||||
from random import randint
|
||||
|
||||
from flask import render_template, redirect, jsonify
|
||||
from flask_login import login_user
|
||||
from flask import render_template, redirect, jsonify, session
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
|
||||
from app import admin_api_client
|
||||
from app.main import main
|
||||
from app.main.dao import users_dao
|
||||
from app.main.encryption import hashpw
|
||||
from app.main.exceptions import AdminApiClientException
|
||||
from app.main.forms import RegisterUserForm
|
||||
from app.models import User
|
||||
|
||||
@@ -26,10 +30,43 @@ def process_register():
|
||||
created_at=datetime.now(),
|
||||
role_id=1)
|
||||
try:
|
||||
sms_code = send_sms_code(form.mobile_number.data)
|
||||
email_code = send_email_code(form.email_address.data)
|
||||
session['sms_code'] = hashpw(sms_code)
|
||||
session['email_code'] = hashpw(email_code)
|
||||
session['expiry_date'] = str(datetime.now() + timedelta(hours=2))
|
||||
users_dao.insert_user(user)
|
||||
login_user(user)
|
||||
return redirect('/two-factor')
|
||||
except Exception as e:
|
||||
return jsonify(database_error=e.message), 400
|
||||
except AdminApiClientException as e:
|
||||
return jsonify(admin_api_client_error=e.value)
|
||||
except SQLAlchemyError:
|
||||
return jsonify(database_error='encountered database error'), 400
|
||||
else:
|
||||
return jsonify(form.errors), 400
|
||||
return redirect('/verify')
|
||||
|
||||
|
||||
def send_sms_code(mobile_number):
|
||||
sms_code = _create_code()
|
||||
try:
|
||||
admin_api_client.send_sms(mobile_number, message=sms_code, token=admin_api_client.auth_token)
|
||||
except:
|
||||
raise AdminApiClientException('Exception when sending sms.')
|
||||
return sms_code
|
||||
|
||||
|
||||
def send_email_code(email):
|
||||
email_code = _create_code()
|
||||
try:
|
||||
admin_api_client.send_email(email_address=email,
|
||||
from_str='notify@digital.cabinet-office.gov.uk',
|
||||
message=email_code,
|
||||
subject='Verification code',
|
||||
token=admin_api_client.auth_token)
|
||||
except:
|
||||
raise AdminApiClientException('Exception when sending email.')
|
||||
|
||||
return email_code
|
||||
|
||||
|
||||
def _create_code():
|
||||
return ''.join(["%s" % randint(0, 9) for _ in range(0, 5)])
|
||||
|
||||
Reference in New Issue
Block a user