fix login.gov to use user uuid instead of email (notify-admin-1277)

This commit is contained in:
Kenneth Kehl
2024-03-08 08:44:27 -08:00
parent 90e6b0b9c2
commit 7c95211649
5 changed files with 65 additions and 0 deletions

View File

@@ -25,6 +25,32 @@ def create_secret_code(length=6):
return "{:0{length}d}".format(random_number, length=length)
def get_login_gov_user(login_uuid, email_address):
"""
We want to check to see if the user is registered with login.gov
If we can find the login.gov uuid in our user table, then they are.
Also, because we originally keyed off email address we might have a few
older users who registered with login.gov but we don't know what their
login.gov uuids are. Eventually the code that checks by email address
should be removed.
"""
print(User.query.filter_by(login_uuid=login_uuid).first())
user = User.query.filter_by(login_uuid=login_uuid).first()
if user:
if user.email_address != email_address:
save_user_attribute(user, {"email_address": email_address})
return user
# Remove this 1 July 2025, all users should have login.gov uuids by now
user = User.query.filter_by(email_address=email_address).first()
if user:
save_user_attribute(user, {"login_uuid": login_uuid})
return user
return None
def save_user_attribute(usr, update_dict=None):
db.session.query(User).filter_by(id=usr.id).update(update_dict or {})
db.session.commit()

View File

@@ -109,6 +109,7 @@ class User(db.Model):
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
name = db.Column(db.String, nullable=False, index=True, unique=False)
email_address = db.Column(db.String(255), nullable=False, index=True, unique=True)
login_uuid = db.Column(db.Text, nullable=True, index=True, unique=True)
created_at = db.Column(
db.DateTime,
index=False,

View File

@@ -19,6 +19,7 @@ from app.dao.users_dao import (
create_secret_code,
create_user_code,
dao_archive_user,
get_login_gov_user,
get_user_and_accounts,
get_user_by_email,
get_user_by_id,
@@ -528,6 +529,16 @@ def set_permissions(user_id, service_id):
return jsonify({}), 204
@user_blueprint.route("/get-login-gov-user", methods=["POST"])
def get_user_login_gov_user():
request_args = request.get_json()
login_uuid = request_args["login_uuid"]
email = request_args["email"]
user = get_login_gov_user(login_uuid, email)
result = user.serialize()
return jsonify(data=result)
@user_blueprint.route("/email", methods=["POST"])
def fetch_user_by_email():
email = email_data_request_schema.load(request.get_json())

View File

@@ -0,0 +1,20 @@
"""
Revision ID: 0411_add_login_uuid
Revises: 410_enums_for_everything
Create Date: 2023-04-24 11:35:22.873930
"""
import sqlalchemy as sa
from alembic import op
revision = "0411_add_login_uuid"
down_revision = "0410_enums_for_everything"
def upgrade():
op.add_column("users", sa.Column("login_uuid", sa.Text))
def downgrade():
op.drop_column("users", "login_uuid")

View File

@@ -15,6 +15,7 @@ from app.dao.users_dao import (
dao_archive_user,
delete_codes_older_created_more_than_a_day_ago,
delete_model_user,
get_login_gov_user,
get_user_by_email,
get_user_by_id,
increment_failed_login_count,
@@ -110,6 +111,12 @@ def test_get_user_by_email(sample_user):
assert sample_user == user_from_db
def test_get_login_gov_user(sample_user):
user_from_db = get_login_gov_user("fake_login_gov_uuid", sample_user.email_address)
assert sample_user.email_address == user_from_db.email_address
assert user_from_db.login_uuid is not None
def test_get_user_by_email_is_case_insensitive(sample_user):
email = sample_user.email_address
user_from_db = get_user_by_email(email.upper())