Email authentication
Auth and access
A key part of making authentication secure, is through verification of user identities. Verification usually happens at sign up, to ensure the person signing up exists and is the intended person gaining access to your app or project.
This topic is a conceptual overview of how identity works in Kinde. There are two parts to a user’s identity in Kinde:
When we use the term ‘identity’, we’re referring to a unique identifier that allows a user to sign in and be verified. An email, phone number, SSO provider, etc.
When a user tries to access a system or service, they provide their identity along with additional credentials (e.g. password, one-time password OTP) to verify their identity and gain access.
This refers to an email, phone number, or username. Identity credentials are created for a user when they first sign up with an email address, phone number, or username. If it’s the first identity to be added, it will be marked as primary.
You can manually add these user identities.
A social identity is created when a user signs up with a social account, or when they sign in with a social connection that supplies an email matching an existing email identity in Kinde and the connection’s email address trust setting allows the identities to be linked, either straight away (Trust) or after the user enters a one-time code (Verify, then trust).
If a user signs up with a social connection set to Trust or Verify, then trust that provides an email address, and that email does not already belong to a user in Kinde, Kinde creates both a social identity and an email identity with that email. They can use this email to sign in with (if an email authentication method is enabled for your application). If the connection is set to Don’t trust, Kinde creates only a social identity.
An enterprise identity is created when a user signs up via an enterprise connection, or when they sign in via an enterprise connection that supplies an email matching an existing email identity and the connection’s email address trust setting allows the identities to be linked, either straight away (Trust) or after the user enters a one-time code (Verify, then trust).
Users with enterprise identities in Kinde can’t also have other identity types in Kinde. E.g. a user can have an email identity and a social identity. But if a user has an enterprise identity, they cannot have other identities. In this case, identity information is sourced with the identity provider and is managed via the identity provider, not in Kinde.
When a user signs in through a social or enterprise connection, the identity provider returns an email address. If that email address already belongs to a user in Kinde, the connection’s Email address trust setting decides what happens next. You choose the setting per connection, and it applies to every application in the environment.
Set Email address trust to Trust only when you know the third-party provider verifies email addresses and does not allow users to change their primary email address. For a safer middle ground, select Verify, then trust. Google social connections are set to Trust by default.
A trusted email provider is one that guarantees the email they issue is verified and also does not allow the user to change their primary email address.
Currently Google is the only provider we treat as trusted by default. When you add a Google social connection in Kinde (or create one through the Kinde Management API without a trust setting), Email address trust is set to Trust by default. You can choose how much to trust emails from any provider when you configure the connection in Kinde (see below), including choosing not to trust Google emails.
Google example (Trust)
This isn’t to say that other email providers are not trustworthy, this purely relates to email addresses and the guarantee that it will not change.
LinkedIn example (Don’t trust)
Verify, then trust is the recommended middle ground. Kinde does not take the provider’s word for the email address, but it doesn’t keep the accounts apart either. Instead, the user proves they own the email address before the identities are linked.
When a user signs in through the connection and the email address returned by the provider already belongs to someone in Kinde:
The code is only required when the email address already belongs to someone. A brand-new email address skips the code and behaves like Trust. An identity that is already linked to this provider signs in as normal. “Belongs to someone” includes subscribers and access-request records, not only users who can sign in.
You choose the trust level per connection, for both social connections (such as Google, Apple, Microsoft, GitHub and custom OAuth 2.0) and enterprise connections (such as Microsoft Entra ID, custom SAML, Okta, Cloudflare, Google Workspace and LastPass).
Go to Settings > Environment > Authentication and scroll to Social connections (or Enterprise connections).
Select Configure on the connection.
Under Provisioning, choose an option in Email address trust:
Select Save.
Email address trust is an environment-level decision. Organization-level connections, such as self-serve SSO and connections created for a single organization, do not show this control. They show Auto-add users in its place.
Choose Verify, then trust unless you are certain the identity provider verifies email addresses and prevents users from changing them, in which case Trust is acceptable. Choose Don’t trust when you never want accounts combined on email address. With Trust, you are taking the provider’s word that the email address is correct, valid and belongs to the person signing in.
Existing connections keep their current behavior. A connection that previously had trust switched on is now set to Trust, and one that had it switched off is now set to Don’t trust. No connection is moved to Verify, then trust automatically.
If a social provider gives us a new first name, last name or picture for a user, Kinde updates these fields in the user profile to match those supplied to us.
This is on by default, but you can turn it off if you wish to keep a static profile. About profile sync.
If you have syncing off at an environment level but turned on at a social connection level we will honor the request for the social connection to sync.
If an enterprise provider gives us a new first name, last name, or picture for a user, Kinde updates these fields in the user profile to match those supplied to us.
This is on by default, but you can turn it off if you wish to keep a static profile. About profile sync.
If you have syncing off at an environment level but turned on at an enterprise connection level we will honor the request for the enterprise connection to sync.
Verification is an authentication security measure that checks the person seeking system access is who they say they are. In addition, an up to date identity provides a secure method to contact a user. Email identity details are required, for example, to reset a user’s password (requested or forced), and are needed to reliably send OTPs and trigger other auth mechanisms, like auth apps.
At Kinde, we don’t treat username identities the same as phone and email identities. If you want users to sign in and authenticate with usernames, they still need to verify themselves (if only once) via email.
Kinde treats usernames as case-insensitive. In other words, we ignore case. We do this because it eliminates the possibility of auth issues and fraud when two usernames are identical in every aspect except the case of one of their letters.
We are happy to support users choosing an aesthetically pleasing username combination, like RosyRose or BuilderBob. We just don’t also support separate identities for rosYrosE and BUilderbob.
For security reasons, you can’t edit a user’s verified identity. But we know it still needs to be possible. People change emails, change names, get new phone numbers, etc.
You can update identities by adding a new identity and deleting the old one. See Add and manage user identities, or via the Kinde API.