Enforce password requirement at compiler level

If a password is required, really enforce it.
Allow email to not be null or not be empty

This allows more cases where an email is not provided in the UI (such as
just leaving it blank)
Making AuthType public

This will allow it to work with unit tests