diff --git a/getting-started/authentication.md b/getting-started/authentication.md
index 01fad15..cb3b648 100644
--- a/getting-started/authentication.md
+++ b/getting-started/authentication.md
@@ -27,13 +27,13 @@ To access user data via Verida APIs, you must include a valid `auth_token` in ev
Below is a typical flow when integrating your application with Verida AI:
1. **Generate an authentication request URL**
- * Include the scopes you require as well as the `redirectUrl` for successful authentication.
+ * Include the `scopes` you require as well as the `redirectUrl` for authentication output.
2. **Redirect the user to the authentication request URL**
- * The user is prompted to grant or deny your application access.
+ * The user is prompted to grant or deny your application access via the Verida Vault web application.
3. **User grants access and is redirected back**
* If the user grants access, they are redirected to your specified `redirectUrl` with an `auth_token` in the query parameters.
4. **Store the `auth_token`**
- * Your application should save the token securely, either linked to the user’s account in your database or in the user’s local browser storage.
+ * Your application should save the token securely, either linked to the user’s account in your database or via other usual ways handling auth tokens.
5. **Make requests to Verida APIs**
* Include the token in the `Authorization` header for all subsequent calls to Verida’s APIs.
@@ -41,54 +41,57 @@ Below is a typical flow when integrating your application with Verida AI:
### Generate an Authentication Request URL
-To start the authentication process, build a URL that directs users to Verida’s authentication endpoint. This URL must include several query parameters:
+To start the authentication process, build a URL that directs users to Verida’s authentication page on the Verida Vault web app `https://app.verida.ai/auth`. This URL must include several query parameters:
-* **`redirectUrl`**: The URL in your application that handles a successful user authentication.
* **`scopes`**: An array of scopes that your application requires. The latest valid scopes can be listed via the [Scopes API](https://api.verida.ai/api/rest/v1/auth/scopes).
* **`payer`**: Specifies who will pay for the API requests made with this auth token. Set this to either `user` or `app`.
+* **`appDID`**: Your application Verida DID is required to identify your application.
+* **`redirectUrl`**: The URL in your application that handles a successful user authentication.
+* **`state`**: Optionally a state object (stringified) for your own reference (User ID, etc.). The state will not be altered and will be returned to the `redirectUrl` as part of the response.
Below is an example authentication request URL (URL-encoded) that includes three scopes:
```
-https://api.verida.ai/api/rest/v1/auth/auth?scopes=api%3Ads-query&scopes=api%3Allm-agent-prompt&scopes=api%3Allm-profile-prompt&redirectUrl=http%3A%2F%2Flocalhost%3A8080%2F
+https://app.verida.ai/auth?scopes=api%3Ads-query&scopes=api%3Allm-agent-prompt&scopes=api%3Allm-profile-prompt&redirectUrl=http%3A%2F%2Flocalhost%3A8080%2F&appDID=did%3Avda%3Amainnet%3A0x8013f9A...086
```
#### TypeScript Example
```ts
// Build authentication URL
-const AUTH_ENDPOINT = "https://api.verida.ai/api/rest/v1/auth/auth";
-const authLink = new URL(AUTH_ENDPOINT);
+const authLink = new URL("https://app.verida.ai/auth");
// Add scopes
authLink.searchParams.append("scopes", "api:ds-query");
authLink.searchParams.append("scopes", "api:llm-agent-prompt");
-// Add your application URL
-authLink.searchParams.append("redirectUrl", "https://yourapplication.com/auth-success");
-
// Application will pay for API requests
authLink.searchParams.append("payer", "app");
+// Your Verida DID identifying your application
+authLink.searchParams.append("appDID", "did:vda:mainnet:0x8013f9A...086");
+
+// Add your application URL to handle the response
+authLink.searchParams.append("redirectUrl", "https://yourapplication.com/auth-callback");
+
+// An optional state object
+authLink.searchParams.append("state", JSON.stringify({ userId: "123" }));
+
// Redirect user to start the authorization process
window.location.href = authLink.toString();
```
***
-### Display the Verida Connect Button
+### Guidelines on displaying Verida Connect to your users
-Instead of automatically redirecting, you can provide a **Connect** button in your UI. When clicked, it sends users to the Verida authentication flow.
+Similar to a standard OAuth mechanism, provide users with a button to explicitly click to intiate the authentication with Verida. The button would direct the user to the Authentication Request URL generated in the previous step.
-
+The button should include a [Verida logo](https://community.verida.network/verida-overview/brand-assets#download-the-brand-asset-pack) and the label "Connect Verida". The logo, label and color scheme must follow Verida's [branding guidelines](https://community.verida.network/verida-overview/brand-assets).
-```html
-
-
-
-```
+
-Replace `${authLink}` with the URL generated in the previous step.
+In addition to the button, consider explaining to your users the reasons your application needs Verida and how their personal data will be used.
***
@@ -96,21 +99,29 @@ Replace `${authLink}` with the URL generated in the previous step.
Once the user grants your application access, they will be redirected to the `redirectUrl` you specified with an `auth_token` query parameter.
-Example of how to capture the `auth_token` in TypeScript:
+If you passed a `state` in the request, it will be returned with response (successfull or not).
+
+In the case of a non-successful authentication, the redirect URL will contains an `error` and `error_description` query parameters. The values for the `error` parameter are: `access_denied`, `invalid_request` and `server_error`.
+
+TypeScript example of how to capture the `auth_token` and other response elements:
```ts
const currentUrl = new URL(window.location.href);
+
const authToken = currentUrl.searchParams.get("auth_token");
+const state = currentUrl.searchParams.get("state");
+const error = currentUrl.searchParams.get("error");
if (authToken) {
- // Save the token, e.g. in localStorage or your application database
- localStorage.setItem("veridaAuthToken", authToken);
-
- // You can now use this token to make requests to Verida APIs
+ // Save the token securely
+ // ...
+ // You can now use this token to make requests to Verida APIs
}
-```
-***
+if (error) {
+ // Handle the failure of the authentication
+}
+```
***
@@ -118,4 +129,4 @@ if (authToken) {
* **Explore Additional Scopes**: Visit [Verida’s Scopes API](https://api.verida.ai/api/rest/v1/auth/scopes) for a comprehensive list of available scopes.
* **Advanced Use Cases**: Consider reading more about Verida’s data storage, encryption, and decentralized identity solutions to fully leverage the ecosystem.
-* **Production Deployment**: If you’re planning a production rollout, ensure you use secure storage for the `auth_token`.
+* **Production Deployment**: If you’re planning a production rollout, ensure you use secure storage for the `auth_token` (https-only cookie, your backend database, etc.).