Passkeys Handbook
Passkeys Handbook
Ebook
The passkeys
handbook
Author: Philippe De Ryck
Ebook The passkeys handbook
Introducing passkeys
Summary
Summary
Summary
Summary
Let's start by taking an honest look into the security of user authentication.
Password spraying
A typical user will rely on their memory to keep track of passwords. Unfortunately,
most users are not gifted with a perfect memory, which implies that the
password should be something they can remember over time. As a result, users
often choose simple passwords (e.g., P@ssw0rd! ), predictable passwords
(e.g., their name), or easy-to-remember passwords (e.g., dictionary words).
Attackers have figured this out and explicitly target this behavior in
password spraying attacks. In such an attack, attackers simply try to log
in as any user with a user's identifier and a password from a list of simple
passwords. Running such an attack with thousands or millions of known
passwords is bound to yield some successful authentication attempts.
Ebook The passkeys handbook 6
Credential stuffing
A second challenge to password-based authentication lies in the numbers. A
typical user has dozens or hundreds of accounts across numerous different
websites. Keeping track of unique passwords for each website in memory is
impossible. As a result, users resort to reusing passwords across websites.
This behavior becomes problematic when the attackers breach one application and
obtain a list of usernames and passwords. Attackers use this data in a credential
stuffing attack, trying to log in to applications using a previously stolen username/
password combination. Credential stuffing attacks are much more likely to succeed
than password spraying attacks, making them significantly more dangerous.
Phishing
User authentication typically relies on the user entering their information in an
authentication form hosted by the application. During this process, there is no
explicit step where the user verifies that they are visiting the legitimate application.
Attackers abuse this pattern using phishing attacks, where they host a
malicious authentication form that looks exactly like the legitimate application.
Suppose the attacker can trick the user into visiting that malicious form and
entering their credentials. In that case, the attacker obtains a known-good
set of credentials, which they can easily abuse whenever they want.
The scale of user authentication across the Internet has only exacerbated
these problems, and the statistics on attacks against user authentication
are mind boggling.
For example, Okta's 2023 report on the State of Secure Identity states that
24.3% of login attempts on their Customer Identity Cloud are considered
credential stuffing.
Percentages do not fully reflect the severity of this problem, so let's try with
an absolute number: In 2022, Microsoft blocked 1,287 password attacks
every second. That means that in the time it took you to read this statistic,
Microsoft has seen more than 10,000 attacks on password-based user
authentication.
Ebook The passkeys handbook 7
• SMS codes: The application sends a random code to the user's phone
using SMS. The user has to provide this code during the authentication
process. This mechanism relies on having access to the user's phone.
Digging deep into the attack patterns against these MFA mechanisms is out
of scope for this ebook, so we'll list a few common attack scenarios instead.
Attackers abuse SIM Swapping attacks to take control of a user's phone
number, allowing them to bypass SMS-based MFA. Online phishing attacks
trick the user into giving valid SMS codes or OTP codes to the attacker,
allowing them to bypass these code-based MFA mechanisms. Attackers
also abuse MFA fatigue to trick the user into approving a push notification
associated with an authentication attempt of the attacker, allowing them to
bypass this mechanism as well.
USB security keys don't suffer from this problem. They are portable by
nature, and modern versions even support wireless communication
with handheld devices, so users can even use a USB security key when
authenticating to the application on their phone. While USB security keys
solve all the technical challenges, they still have one significant downside:
cost. A USB security key can cost between $25 and $100, and it is often
recommended to have a backup key as well. These solutions are often used
in a corporate setting, where the company is willing to invest in security.
However, expecting a typical user to purchase such USB security keys for
everyday use is a pipe dream.
Introducing passkeys
This image here shows the conceptual idea behind passkeys with a
passkey stored on the user's local device, such as their laptop. As you
can see, authentication is entirely handled using previously created
keys, without the need for the user to provide any credentials to the web
application. Don't worry if this does not make sense yet. We will definitely
dive deeper into passkeys in upcoming chapters.
Sounds great! So, let's take a look at what was needed to bring passkeys
to life.
Finally, note that passkeys can also be tied to a specific device, making
it possible to use the passkey on that device without syncing it to other
devices. This type of passkey is aptly named a device-bound passkey.
Such passkeys are less practical for consumer-centric services, but
they are useful for securing business applications, where a user always
authenticates from the same device.
Ebook The passkeys handbook 11
Summary
Now that we know what passkeys are supposed to do, it's about time that
we dive into the use of passkeys in practice. In the next chapter, we explore
passkeys from the user's perspective.
Chapter #2 In the previous chapter, we covered the why and what of passkeys. In this
first deep-dive chapter, we approach passkeys from the user's perspective.
By the end of this chapter, you will understand how users can leverage
passkeys to secure their accounts.
Ebook The passkeys handbook 12
During this authentication process, the user's phone signs a challenge with
a private key stored on the device. So, how did the passkey end up on the
user's phone in the first place?
Ebook The passkeys handbook 13
Before being able to authenticate with a passkey, the user has to create a
passkey and register it with their account for the application. In a passkey-
only world, this would happen when the user creates a new account. Let's
take a look at how that would work in practice using the learnpasskeys.io
playground.
2. The frontend application triggers the passkey creation, asking the user
to create a passkey on an authenticator (e.g., a phone).
The screenshots below illustrate a passkey scenario where the user creates
a passkey on their phone through a QR code.
The user is prompted to select an When the user selects their The phone prompts the user
authenticator since they may have phone, they get a QR code to for authentication, which
multiple devices capable of handling launch the passkey creation will rely on biometrics or a
passkeys. process on the phone. PIN code to lock the newly
created passkey.
Ebook The passkeys handbook 14
2. Navigate to the account settings and create a new passkey, which will
take the user through the same steps as we illustrated before.
Once these steps have been completed, the application is confident that
the user's passkey is correctly set up and working as intended. At this point,
the application can prompt the user to disable their traditional password-
based authentication. Doing so would eradicate typical attacks against
password-based authentication, such as phishing, credential stuffing, and
brute force attacks.
With all this talk about passkeys and signatures, it has become time
to dive deeper into the mechanics of passkeys. Why is this key-based
authentication so great? And who's responsible for doing what?
Before we dive in, know that this section may not address your hunger for
technical details yet. In the next chapter, we dive into the implementation of
passkeys, including the browser APIs to create and use passkey credentials.
Note that signature data is typically represented in a binary format but often
encoded into a format compatible with text-based protocols such as HTTP.
Common encodings are base64 and hex.
The public key is used to verify signatures. In this step, the party verifying
the signature provides three inputs to a cryptographic verification function:
• The signature.
• The public key associated with the private key that should have been
used.
A valid signature ensures that the data is an exact match to the data that
was signed. It also ensures that the private key used to sign the data is
uniquely linked to the public key used to verify the signature.
Key-based authentication
One of the scenarios that can be implemented with digital signatures is
user authentication. By creating a valid signature when requested by the
application, the user can prove that they possess a private key that should
only be known to them. The image below illustrates the process of key-
based user authentication.
Ebook The passkeys handbook 17
1. Provide a challenge
2. Sign the challenge using the private key
3. Authenticate by sending the signature
4. Verify the signature using the user’s
public key
Concretely, the application to which the user is authenticating asks the user
to sign a challenge with their private key. The signature of the challenge
is submitted back to the application. The application now uses the user's
public key to verify the signature, thereby confirming whether the user
possessed the correct private key.
• Since the private key is not known to the application, there is no risk of it
being compromised in a data breach.
The role of the backend and the browser do not need much additional
One concrete implementation of explanation, but the authenticator does. The authenticator is a key store
the CTAP protocol supports the
with the ability to handle private keys securely. The authenticator is
user scanning a QR code with
their smartphone. Under the hood, responsible for generating and storing keys, authenticating the user when
scanning the QR code allows the a key is being used, and interacting with the browser to exchange the
client, in this case the browser, to
provide the phone with temporary challenge and response. The exact protocol used between the browser and
cryptographic key information. The the authenticator is the Client To Authenticator Protocol 2 (CTAP2), which
browser then uses these keys to
encrypt a Bluetooth beacon, also is defined by the FIDO2 standard. This protocol embeds the necessary
known as a BLE advertisement, and security mechanisms to ensure proximity of the authenticator and to resist
sends it out from the local device
(i.e., the user's computer). When the
phishing attacks.
phone is in proximity to the laptop,
it receives this beacon and uses the Until now, we mostly talked about using a phone as an authenticator, and
keys from the QR code to decrypt there's a good reason: a phone is a highly convenient authenticator. Most
the message. Once that has been
completed, both the browser and the users have a smartphone, and they carry it around everywhere they go.
phone use a tunnel service to set up Additionally, modern phones can protect passkeys with biometric or PIN-
a reliable communication channel.
More details about this protocol can
based verification. Finally, phones can easily communicate with the browser
be found in section 11.5.1 of the FIDO over Bluetooth to exchange passkey and signature information.
CTAP 2.2 protocol.
Ebook The passkeys handbook 19
However, with passkeys, nothing prevents the user from having more than
one passkey for an account on a web application. In fact, it is actually
recommended that the application prompts the user to set up a passkey
for their local device after using the phone-based authenticator. Such a
scenario would look like this:
2. The user creates a new passkey for their local device (e.g., using
Windows Hello or Apple's Touch ID).
3. The application registers this new passkey for the user's account.
4. The next time the user wishes to authenticate, the browser will allow
the user to authenticate with the local passkey, removing the need to
interact with the phone.
Note that the protocols that enable passkeys offer the necessary
implementation flexibility as well. For example, modern password managers,
such as Bitwarden and OnePassword, have also incorporated passkey
support into their products. Not only does this make it easy to manage
passkeys, but it also automatically enables synchronization of passkeys
between multiple devices. A similar feature is supported by platform-
based authenticators, such as Google Password Manager or Apple iCloud
Keychain.
Finally, note that the exact mechanism to authenticate the user during the
authentication process is at the discretion of the authenticator. Phones
typically use biometrics or PINs for this purpose, but other authenticators
can choose a different user authentication mechanism.
So how does the phone keep track of all these passkeys? Simple! A
passkey is associated with the domain of the application that is creating it.
If the application runs on https://passkeys.example.com/register , the
passkey can be associated with passkeys.example.com or optionally with
example.com . The passkey will never be associated with content running
on a different location.
Finally, the user can have more than one passkey for a specific application.
The association of a passkey with These passkeys can belong to a single account or multiple accounts. The
an application's domain also plays
exact details of how to handle such a scenario are left at the discretion of
a crucial role in phishing prevention.
Should the attacker succeed in the authenticator. However, a typical way to handle this is by prompting the
luring the user to a phishing page, user to ask which passkey they want to use.
they are restricted to using their
domain or parent domain in a
passkey authentication request.
Syncing passkeys across devices
So, for https://l1nkedin.com , Since passkeys are intended to be used as a primary authentication factor,
there is no way the attacker can
portability is a crucial feature. Passkeys will only succeed when the user has
launch a passkey authentication
request using the credentials them available when needed.
associated with linkedin.com. As
a result, the phishing attempt will be Portability comes very naturally for passkeys stored on a physical device
unsuccessful.
that is carried by the user. Software-based authenticators offer support for
syncing passkeys as well.
Ebook The passkeys handbook 21
The screenshots below show how we can use the passkey we created on
our phone earlier to authenticate on our macOS computer with Safari.
Summary
• Get your hands dirty and build a simple demo with an HTML registration
page and an HTML login page.
• Use the webauthn.me Debugger to play around with all the different API
configuration parameters and see their effect in your browser.
By the end of this chapter, you will know everything you need to know to
handle passkeys in your frontend applications.
Passkeys are built on top of the Web Authentication API, which has been
around longer than passkeys have. The Web Authentication API, WebAuthn
in short, offers a JavaScript API to enable key-based authentication for web
applications. Even before passkeys were introduced, WebAuthn enabled
key-based authentication with authenticators such as Yubikeys, either as
primary or secondary authentication factors.
In this section, we dive into the details of the Web Authentication API but
limit ourselves to concepts relevant to enabling passkeys. We refer to MDN
for a complete reference on the Web Authentication API.
Ebook The passkeys handbook 23
Unfortunately, the omitted details hidden behind the ... add quite a bit
of complexity. The code snippet below shows a typical configuration for
creating a new passkey to authenticate users to a web application. Let's
take a closer look at the different parameters that are provided here.
Ebook The passkeys handbook 24
}
});
• The rp field identifies the relying party, which is the web application
registering the passkey.
• The user field contains metadata about the user to which this passkey
belongs.
Finally, the create function returns a promise, which resolves into an object
of the type PublicKeyCredential . This object contains the metadata
about the generated key pair, along with the signature of the challenge. Note
that the response does not include the private key, which is securely stored
within the authenticator.
The generated key data is sent to the server, where it is stored with the
user's account. We discuss these details later in this chapter.
This is the pop-up window shown by the browser when the get method is executed.
The code above will trigger the browser to display the UI, allowing the user
to select a relevant authenticator associated with app.example.com . After
the user has approved the authentication, for example, using FaceID, the
authenticator will sign the challenge using the private key for
app.example.com .
Just like with registration, this function returns a promise that resolves
into an object of the type PublicKeyCredential . The data contains
information about the key, the user information embedded in the key, and
the signature of the challenge.
The generated key data is sent to the backend, which will verify the
signature before considering the user as authenticated. We discuss these
details later in this chapter.
During the registration of a passkey, the options for the create function
include an authenticatorSelection property. This property allows fine-
grained configuration of the desired type of passkey that should be created.
Omitting the value allows both types of authenticators.
Ebook The passkeys handbook 27
When set to required , any use of the authenticator for signing a challenge
requires verifying the user's identity. Example verification procedures
are biometric scans, prompting for a master secret, or a PIN code. When
set to preferred , verification of the user should be obtained, but can
be skipped by the authenticator if it is deemed infeasible (e.g., a closed
laptop lid preventing access to a fingerprint sensor). Finally, when set to
discouraged , the authenticator can operate without verifying the user's
identity.
The default setting is preferred , and the exact setting mostly depends on
the sensitivity of the application. Whenever possible, it is recommended to
set this to required .
To avoid this negative impact on the user experience, browser vendors have
implemented support for a conditional UI, supported by a feature called
conditional mediation. This new concept allows the frontend to start passkey
authentication on the condition that the browser can find a passkey for
the current application. The UI typically allows the user to select one of the
passkeys as an autocomplete option underneath the form element.
Passkey autocomplete
The first step to enable the conditional UI is to tell the browser where to show
the option to use a known passkey. In the code snippet below, you can see
that we have added webauthn to the form field's autocomplete attribute.
The image below shows what it will look like when we tell the browser to
start the passkey autocomplete process. Note that the browser can auto-
discover passkeys, so there's no need to fill out a user identifier. In the next
topic, we will explain how to trigger this UI from JavaScript.
To start the flow with conditional mediation enabled, we need to add the
property mediation:'conditional' to our authentication step. The code
snippet below shows how to do that.
await PublicKeyCredential.isConditionalMediationAvailable();
Before we dive into the different steps of the flow, there are two important
concepts we need to clarify: an attestation and an assertion.
Ebook The passkeys handbook 30
Now, there's a bit more to it, so let's look into the details of both.
Attestation
Every authenticator comes with a built-in cryptographic certificate and
corresponding key pair, which is uniquely linked to the authenticator
manufacturer. For example, a certain batch of Yubikey 5C authenticators
will have the same attestation certificate built-in, defining the properties of
the authenticator and the manufacturer. The same holds for other types of
authentications, such as mobile phones. All models of Samsung Galaxy S8
phones produced at a certain time or in a certain production run will have
the same attestation certificate issued by Samsung.
Assertion
Assertions are a bit more straightforward. An assertion is basically the
response given by the Web Authentication API when asked to sign a
challenge with a key from the authenticator. The assertion object contains a
couple of specific properties, which we will discuss later when talking about
the authentication flow.
Note that the signature used in the assertion response is generated by the
private key of the passkey, while the signature in the attestation response is
generated by the private key built into the authenticator.
Ebook The passkeys handbook 31
When registering a new passkey, the WebAuthn API call expects a user
handle. It is a common practice to defer the generation of these user
handles to the backend. To facilitate this, the registration flow starts by
prompting the user for their email address and name information (step 1).
This information is then included in a request to the backend (step 2).
Between steps 2 and 3, the backend can decide to require the user to verify
their email address. For example, the backend can send a secret code
to the email address and prompt the user to enter this code through the
browser. Since this step is optional, we have not shown it on the diagram
here.
Once the backend decides to move forward with registering a passkey for
the user, it needs to provide the browser with a user handle. This handle
should not contain any PII that allows it to be linked to a user. Typical
implementations generate an opaque value that is associated with the
user's account. There are notadditional guidelines that specify the exact
contents of this opaque value. One option is to generate random unique
identifiers as the user handles and store them with the user's account.
Ebook The passkeys handbook 32
Another option is to use the email address to calculate an HMAC and use
that value as the user handle. Whatever you decide to use, keep in mind that
the user handle is provided during authentication and is typically used to
look up a user account from the user store.
When the frontend receives the user handle and challenge (step 4), it can
launch the passkey registration request by calling the
navigator.credentials.create function (step 5). The user may be
prompted to select an authenticator (step 6), after which a key pair is
generated, and the challenge is signed (step 7). The browser receives the
response from the authenticator (step 8) and exposes it to the frontend
as the PublicKeyCredential . This PublicKeyCredential contains a
response property, which is an AuthenticatorAttestationResponse
during the registration phase.
Finally, in step 10, the backend is responsible for handling the passkey
registration information. Going into the nitty gritty details of validating the
binary data would take us too far for this ebook. Instead, we'll highlight the
backend's responsibilities:
• Validate the incoming data and ensure all properties match the
expectations for the generated passkey.
• Verify the provided signature using the included public key and
challenge to ensure that the passkey was effectively used to sign the
challenge.
• Store the newly created public key and passkey metadata along with
the user's details.
Note that the first two of these responsibilities are typically handled by a
server-side passkey library, absolving developers from the responsibility
of handling these details themselves. Some libraries require the entire
PublicKeyCredential object as input. In that case, it is recommended to
base64url-encode the whole object and ship it to the server.
1. Get a challenge
2. Generate an authentication challenge
3. Challenge
4. Start conditional mediation
5. The user selects an exisitng passkey
6. Challenge signature request for
https://example.com
7. Sign the challenge and create a
response
8. Signature response
9. Signature response
10. Verify signature with stored public key
Ebook The passkeys handbook 34
In the next step, the frontend is supposed to collect this credential information
and send it to the backend (step 9). Similar to the registration phase, there is
no standardized way to format this request, but a best practice is to encode
the binary data to make it safe to transport in HTTP requests. The list below
shows which properties of the PublicKeyCredential response object
should be included and how you should handle them:
Finally, in step 10, the backend is responsible for handling the passkey
authentication information. Going into the nitty gritty details of validating the
binary data would take us too far for this ebook. Instead, we'll highlight the
backend's responsibilities:
• Validate the incoming data and ensure all properties match the expectations
for the user's passkey (e.g., ensure it matches a stored credential).
Summary
Passkeys are built on two core building blocks: the Web Authentication
API for handling credentials and new UI features to enable a smooth user
experience. By using conditional mediation, frontends can rely on the
browser's autocomplete UI to allow users to select a known passkey during
authentication. With these features, passkeys have everything they need to
fully replace passwords as the primary authentication mechanism.
In the next and final chapter, we look into ways to integrate passkeys
into your application architecture. We also explore using Auth0 to adopt
passkeys with little development effort.
Chapter #4 In previous chapters, we have covered what passkeys are, how users can
authenticate with them, and how developers can integrate support in
applications.
Integrating
In this final chapter, we approach passkeys from the perspective of a
passkeys in your software architect. We explore challenges and best practices for adopting
applications and integrating passkeys into our application. Concretely, we will tackle:
By the end of this chapter, you will be ready to use passkeys efficiently in
any application. Let's get started and wrap things up with everything you
need to know about bringing passkeys into the real world.
In that case, you can choose whether you want to use conditional mediation
or not. When not using conditional mediation and directly starting a passkey
authentication, the browser will start the popup-based flow, allowing
the user to select a passkey from the available options. When using the
Ebook The passkeys handbook 37
In this section, we'll explore two patterns that enable you to implement
passkey authentication in different applications without creating an
individual passkey for each application.
The starting point for what we will cover in this section is an application
already integrated with Auth0 using OpenID Connect. Our Auth0 tenant
uses the default configuration, which relies on email addresses and
passwords for authentication. We will enable passkeys and try it out to get
a good idea of the effort it takes to implement passkey support.
Ebook The passkeys handbook 39
The image below shows how to enable the identifier-first authentication flow.
It is a predefined setting on the Authentication Profile configuration page.
When we now want to log in or sign up for our application, we end up at the
following Auth0 page. Note how this page already shows the option to sign
in with a passkey.
But first, let's create a user account. Clicking the Sign up link sends us here,
where we can provide an email address.
Now that we have an account, we can try logging in with a passkey. First,
we have to log out from Auth0 to terminate the active session. When we
try to log in to our application, we end back up at Auth0. If we now click the
username field, we will be prompted to load a passkey using conditional
mediation.
Of course, we can also click the button "Continue with a passkey" to start
the passkey authentication process without conditional mediation. Note
that the passkey policy for the database allows you to configure if you want
to use both conditional mediation and the button, or just one of both.
If you do not want to enable this prompt for existing users, you can turn it
off in the passkey settings for your database.
There are two options here. The first option assumes you start from a clean
slate and want to rely solely on passkeys for authentication. At the time of
writing, Auth0 does not support disabling password-based authentication
through the dashboard. However, you can implement this yourself using
actions.
Concretely, this involves creating a new custom action and adding it to the
login flow. In this action, we can check if the user attempted to authenticate
with a password and reject that authentication attempt.
The second option handles existing databases, where only some users
have enabled passkeys. In that scenario, we also use an action, but
the logic is more complicated. Concretely, we would check if the user
Ebook The passkeys handbook 44
Note that neither approach can affect the login experience UI. However,
they both effectively prevent password-based authentication, either for the
legitimate user or an attacker abusing their credentials.
Summary
And the best part? Auth0 offers passkey support out of the box.
Ebook The passkeys handbook 45
What are passkeys? Passkeys are a new form of user authentication designed to replace traditional passwords. Instead
of sending a text-based secret, the password, from the browser to the backend, passkeys rely on
a key-based authentication mechanism. Passkeys use cryptographic signatures to prove the user
possesses a secret key stored on an authenticator.
What are the security The underlying cryptographic mechanics of passkeys effectively mitigate various threats against user
properties of passkeys? authentication. Here's an overview of the security properties of passkeys:
Contrary to passwords, passkeys do not need the backend application to store sensitive information.
Data breaches do not impact the security of passkey-based authentication.
• Passkeys are not vulnerable to brute-force attacks, password spraying attacks, and credential
stuffing attacks.
• Passkeys are uniquely linked to a website's domain, making them invulnerable to phishing
attempts. Even the most advanced online phishing attacks are effectively mitigated by passkeys.
• Passkeys that require user verification provide the same properties as multi-factor authentication
in a single authentication step. They rely on something the user possesses (i.e., a cryptographic
key) and biometrics or a PIN to unlock the key.
How can you implement Implementing passkeys impacts the application on three different levels: HTML,
passkeys? frontend JavaScript code, and backend code. The list below summarizes what
is needed to implement passkey registration and authentication.
• The frontend code needs to offer a way for a user to register a new passkey. To handle this, the
underlying Web Authentication API offers the navigator.credentials.create operation.
• The backend needs to accept public passkey data from the frontend and store this information
with the user data in the database.
• It is recommended that the frontend HTML augments the authentication form with an
autocomplete="webauthn" property to support the passkey autofill UI.
• The backend needs to accept the passkey signature and verify that the signature is indeed
correct and made by a passkey that is known for this particular user. The backend additionally
verifies the origin associated with the user's authentication. If everything checks out, the user is
now authenticated.
How do you integrate Given the complexity of implementing passkeys, it is recommended to offload this responsibility to a
passkeys into your central identity provider. Concretely, this means that the application implements user authentication
application? with OpenID Connect. Running an OpenID Connect flow will require the user to authenticate at the
identity provider, where they can use a passkey.
Auth0 supports passkeys out-of-the-box on all their plans, including the free plan. Enabling passkey
support in Auth0 is a matter of clicking a few options in the dashboard with zero code effort.
Wrapping up We hope you got everything you wanted out of this ebook. What's left is to set up your Auth0 tenant
with passkeys and help your users towards a future with secure authentication.
Ebook The passkeys handbook 46
Disclaimer These materials and any recommendations within are not legal,
privacy, security, compliance, or business advice. These materials
are intended for general informational purposes only and may not
reflect the most current security, privacy, and legal developments
nor all relevant issues. You are responsible for obtaining legal,
security, privacy, compliance, or business advice from your own
lawyer or other professional advisor and should not rely on the
recommendations herein. Okta is not liable to you for any loss
or damages that may result from your implementation of any
recommendations in these materials. Okta makes no representations,
warranties, or other assurances regarding the content of these
materials. Information regarding Okta’s contractual assurances to its
customers can be found at okta.com/agreements.
About Okta
Okta is the World’s Identity Company. As the leading independent Identity partner, we free everyone to safely use any technology —
anywhere, on any device or app. The most trusted brands trust Okta to enable secure access, authentication, and automation. With
flexibility and neutrality at the core of our Okta Workforce Identity and Customer Identity Clouds, business leaders and developers
can focus on innovation and accelerate digital transformation, thanks to customizable solutions and more than 7,000 pre-built
integrations. We’re building a world where Identity belongs to you. Learn more at okta.com.
Auth0 is a foundational technology of Okta and its flagship product line — Okta Customer Identity Cloud. Developers can learn more
and create an account for free at Auth0.com.
Okta Inc.
100 First Street
San Francisco, CA 94105
[email protected]
1-888-722-7871