This is documentation for Serverpod 2.1.0, which is no longer actively maintained.
For up-to-date documentation, see the latest version (2.3.0).
Version: 2.1.0
The basics
Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the serverpod_auth module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood.
-
The Session object provides information about the current user. A unique userId identifies a user. You should use this id whenever you a referring to a user. Access the id of a signed-in user through the auth field of the Session object.
-
Future<void>myMethod(Session session)async{ var userId =await session.auth.authenticatedUserId; ... }
+
The Session object provides information about the current user. A unique userId identifies a user. You should use this id whenever you a referring to a user. Access the id of a signed-in user through the authenticated asynchronous getter of the Session object.
+
Future<void>myMethod(Session session)async{ final authenticationInfo =await session.authenticated; final userId = authenticationInfo?.userId; ... }
You can also use the Session object to check if a user is authenticated:
Future<void>myMethod(Session session)async{ var isSignedIn =await session.isUserSignedIn; ... }
This is documentation for Serverpod 2.2.0, which is no longer actively maintained.
For up-to-date documentation, see the latest version (2.3.0).
Version: 2.2.0
The basics
Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the serverpod_auth module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood.
-
The Session object provides information about the current user. A unique userId identifies a user. You should use this id whenever you a referring to a user. Access the id of a signed-in user through the authenticated field of the Session object.
-
Future<void>myMethod(Session session)async{ var userId =(await session.authenticated)?.userId; ... }
+
The Session object provides information about the current user. A unique userId identifies a user. You should use this id whenever you a referring to a user. Access the id of a signed-in user through the authenticated asynchronous getter of the Session object.
+
Future<void>myMethod(Session session)async{ final authenticationInfo =await session.authenticated; final userId = authenticationInfo?.userId; ... }
You can also use the Session object to check if a user is authenticated:
Future<void>myMethod(Session session)async{ var isSignedIn =await session.isUserSignedIn; ... }
diff --git a/docs/2.2.0/concepts/authentication/custom-overrides.html b/docs/2.2.0/concepts/authentication/custom-overrides.html
index 99b7faaca2..9ec1e06f75 100644
--- a/docs/2.2.0/concepts/authentication/custom-overrides.html
+++ b/docs/2.2.0/concepts/authentication/custom-overrides.html
@@ -4,7 +4,7 @@
Custom overrides | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/authentication/providers/apple.html b/docs/2.2.0/concepts/authentication/providers/apple.html
index c2d06c346c..159517f3cb 100644
--- a/docs/2.2.0/concepts/authentication/providers/apple.html
+++ b/docs/2.2.0/concepts/authentication/providers/apple.html
@@ -4,7 +4,7 @@
Apple | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/authentication/providers/custom-providers.html b/docs/2.2.0/concepts/authentication/providers/custom-providers.html
index 4f6fe14294..967561568c 100644
--- a/docs/2.2.0/concepts/authentication/providers/custom-providers.html
+++ b/docs/2.2.0/concepts/authentication/providers/custom-providers.html
@@ -4,7 +4,7 @@
Custom providers | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/authentication/providers/email.html b/docs/2.2.0/concepts/authentication/providers/email.html
index 41f0279b67..58dca53ce9 100644
--- a/docs/2.2.0/concepts/authentication/providers/email.html
+++ b/docs/2.2.0/concepts/authentication/providers/email.html
@@ -4,7 +4,7 @@
Email | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/authentication/providers/firebase.html b/docs/2.2.0/concepts/authentication/providers/firebase.html
index 8d94f48015..f72fff6cd4 100644
--- a/docs/2.2.0/concepts/authentication/providers/firebase.html
+++ b/docs/2.2.0/concepts/authentication/providers/firebase.html
@@ -4,7 +4,7 @@
Firebase | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/authentication/providers/google.html b/docs/2.2.0/concepts/authentication/providers/google.html
index ef2d411ce0..0e4835966d 100644
--- a/docs/2.2.0/concepts/authentication/providers/google.html
+++ b/docs/2.2.0/concepts/authentication/providers/google.html
@@ -4,7 +4,7 @@
Google | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/authentication/setup.html b/docs/2.2.0/concepts/authentication/setup.html
index 2475f0ed12..443eeffcd5 100644
--- a/docs/2.2.0/concepts/authentication/setup.html
+++ b/docs/2.2.0/concepts/authentication/setup.html
@@ -4,7 +4,7 @@
Setup | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/authentication/working-with-users.html b/docs/2.2.0/concepts/authentication/working-with-users.html
index 8450ae7dcd..4cd980c25f 100644
--- a/docs/2.2.0/concepts/authentication/working-with-users.html
+++ b/docs/2.2.0/concepts/authentication/working-with-users.html
@@ -4,7 +4,7 @@
Working with users | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/backward-compatibility.html b/docs/2.2.0/concepts/backward-compatibility.html
index e23896f1bb..939b669076 100644
--- a/docs/2.2.0/concepts/backward-compatibility.html
+++ b/docs/2.2.0/concepts/backward-compatibility.html
@@ -4,7 +4,7 @@
Backward compatibility | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/caching.html b/docs/2.2.0/concepts/caching.html
index 94fdcf115c..9ffd9681a9 100644
--- a/docs/2.2.0/concepts/caching.html
+++ b/docs/2.2.0/concepts/caching.html
@@ -4,7 +4,7 @@
Caching | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/configuration.html b/docs/2.2.0/concepts/configuration.html
index 42f00bb260..1fbb8a6e9b 100644
--- a/docs/2.2.0/concepts/configuration.html
+++ b/docs/2.2.0/concepts/configuration.html
@@ -4,7 +4,7 @@
Configurations | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/database/connection.html b/docs/2.2.0/concepts/database/connection.html
index 17cb5673b5..3843f16e2c 100644
--- a/docs/2.2.0/concepts/database/connection.html
+++ b/docs/2.2.0/concepts/database/connection.html
@@ -4,7 +4,7 @@
Connection | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/database/crud.html b/docs/2.2.0/concepts/database/crud.html
index 4333522955..604e678065 100644
--- a/docs/2.2.0/concepts/database/crud.html
+++ b/docs/2.2.0/concepts/database/crud.html
@@ -4,7 +4,7 @@
CRUD | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/database/filter.html b/docs/2.2.0/concepts/database/filter.html
index 4033df4978..70d255fff8 100644
--- a/docs/2.2.0/concepts/database/filter.html
+++ b/docs/2.2.0/concepts/database/filter.html
@@ -4,7 +4,7 @@
Filter | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/database/indexing.html b/docs/2.2.0/concepts/database/indexing.html
index 8f2615564c..510c0a82d5 100644
--- a/docs/2.2.0/concepts/database/indexing.html
+++ b/docs/2.2.0/concepts/database/indexing.html
@@ -4,7 +4,7 @@
Indexing | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/database/migrations.html b/docs/2.2.0/concepts/database/migrations.html
index e8bbd7cb02..cb654f2df5 100644
--- a/docs/2.2.0/concepts/database/migrations.html
+++ b/docs/2.2.0/concepts/database/migrations.html
@@ -4,7 +4,7 @@
Migrations | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/database/models.html b/docs/2.2.0/concepts/database/models.html
index 9f3d5d132a..d0f70144ff 100644
--- a/docs/2.2.0/concepts/database/models.html
+++ b/docs/2.2.0/concepts/database/models.html
@@ -4,7 +4,7 @@
Models | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/database/pagination.html b/docs/2.2.0/concepts/database/pagination.html
index 3a810c854f..514285455c 100644
--- a/docs/2.2.0/concepts/database/pagination.html
+++ b/docs/2.2.0/concepts/database/pagination.html
@@ -4,7 +4,7 @@
Pagination | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/database/raw-access.html b/docs/2.2.0/concepts/database/raw-access.html
index c611eaf37d..4fc27fb7ed 100644
--- a/docs/2.2.0/concepts/database/raw-access.html
+++ b/docs/2.2.0/concepts/database/raw-access.html
@@ -4,7 +4,7 @@
Raw access | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/database/relation-queries.html b/docs/2.2.0/concepts/database/relation-queries.html
index 88c5e51dbf..d98a83e851 100644
--- a/docs/2.2.0/concepts/database/relation-queries.html
+++ b/docs/2.2.0/concepts/database/relation-queries.html
@@ -4,7 +4,7 @@
Relation queries | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/database/relations/many-to-many.html b/docs/2.2.0/concepts/database/relations/many-to-many.html
index fd935560e9..9e3faf9fbf 100644
--- a/docs/2.2.0/concepts/database/relations/many-to-many.html
+++ b/docs/2.2.0/concepts/database/relations/many-to-many.html
@@ -4,7 +4,7 @@
Many-to-many | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/database/relations/modules.html b/docs/2.2.0/concepts/database/relations/modules.html
index 93cc0f9eff..404f309f85 100644
--- a/docs/2.2.0/concepts/database/relations/modules.html
+++ b/docs/2.2.0/concepts/database/relations/modules.html
@@ -4,7 +4,7 @@
Relations with modules | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/database/relations/one-to-many.html b/docs/2.2.0/concepts/database/relations/one-to-many.html
index cf7cdab041..134793cf84 100644
--- a/docs/2.2.0/concepts/database/relations/one-to-many.html
+++ b/docs/2.2.0/concepts/database/relations/one-to-many.html
@@ -4,7 +4,7 @@
One-to-many | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/database/relations/one-to-one.html b/docs/2.2.0/concepts/database/relations/one-to-one.html
index 1c4bf24195..0c236cff1a 100644
--- a/docs/2.2.0/concepts/database/relations/one-to-one.html
+++ b/docs/2.2.0/concepts/database/relations/one-to-one.html
@@ -4,7 +4,7 @@
One-to-one | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/database/relations/referential-actions.html b/docs/2.2.0/concepts/database/relations/referential-actions.html
index c426fc73e6..bc7069a8ce 100644
--- a/docs/2.2.0/concepts/database/relations/referential-actions.html
+++ b/docs/2.2.0/concepts/database/relations/referential-actions.html
@@ -4,7 +4,7 @@
Referential actions | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/database/relations/self-relations.html b/docs/2.2.0/concepts/database/relations/self-relations.html
index 4679d4a128..d814b2127e 100644
--- a/docs/2.2.0/concepts/database/relations/self-relations.html
+++ b/docs/2.2.0/concepts/database/relations/self-relations.html
@@ -4,7 +4,7 @@
Self-relations | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/database/sort.html b/docs/2.2.0/concepts/database/sort.html
index 8e721a9caa..0ea6454973 100644
--- a/docs/2.2.0/concepts/database/sort.html
+++ b/docs/2.2.0/concepts/database/sort.html
@@ -4,7 +4,7 @@
Sort | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/database/transactions.html b/docs/2.2.0/concepts/database/transactions.html
index 6b2ec72dc8..ffbd61be4d 100644
--- a/docs/2.2.0/concepts/database/transactions.html
+++ b/docs/2.2.0/concepts/database/transactions.html
@@ -4,7 +4,7 @@
Transactions | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/exceptions.html b/docs/2.2.0/concepts/exceptions.html
index 2c98e27846..9a2d2bedaa 100644
--- a/docs/2.2.0/concepts/exceptions.html
+++ b/docs/2.2.0/concepts/exceptions.html
@@ -4,7 +4,7 @@
Error handling and exceptions | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/experimental.html b/docs/2.2.0/concepts/experimental.html
index f5e273a665..7bedcdb45f 100644
--- a/docs/2.2.0/concepts/experimental.html
+++ b/docs/2.2.0/concepts/experimental.html
@@ -4,7 +4,7 @@
Experimental features | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/file-uploads.html b/docs/2.2.0/concepts/file-uploads.html
index e118412e27..f6b3c1e0e3 100644
--- a/docs/2.2.0/concepts/file-uploads.html
+++ b/docs/2.2.0/concepts/file-uploads.html
@@ -4,7 +4,7 @@
Uploading files | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/health-checks.html b/docs/2.2.0/concepts/health-checks.html
index 0b31248408..3e0fdd8e6c 100644
--- a/docs/2.2.0/concepts/health-checks.html
+++ b/docs/2.2.0/concepts/health-checks.html
@@ -4,7 +4,7 @@
Health checks | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/logging.html b/docs/2.2.0/concepts/logging.html
index f7f0de0334..145a43b31a 100644
--- a/docs/2.2.0/concepts/logging.html
+++ b/docs/2.2.0/concepts/logging.html
@@ -4,7 +4,7 @@
Logging | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/models.html b/docs/2.2.0/concepts/models.html
index 0b90c05199..f7dde6b1ed 100644
--- a/docs/2.2.0/concepts/models.html
+++ b/docs/2.2.0/concepts/models.html
@@ -4,7 +4,7 @@
Working with models | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/modules.html b/docs/2.2.0/concepts/modules.html
index e52240617d..9a796da4ce 100644
--- a/docs/2.2.0/concepts/modules.html
+++ b/docs/2.2.0/concepts/modules.html
@@ -4,7 +4,7 @@
Modules | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/scheduling.html b/docs/2.2.0/concepts/scheduling.html
index 61faf33782..839d581fd1 100644
--- a/docs/2.2.0/concepts/scheduling.html
+++ b/docs/2.2.0/concepts/scheduling.html
@@ -4,7 +4,7 @@
Scheduling | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/serialization.html b/docs/2.2.0/concepts/serialization.html
index 6b3e64f0d2..680320ab5d 100644
--- a/docs/2.2.0/concepts/serialization.html
+++ b/docs/2.2.0/concepts/serialization.html
@@ -4,7 +4,7 @@
Custom serialization | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/server-events.html b/docs/2.2.0/concepts/server-events.html
index 65187211ec..18e1ecbf31 100644
--- a/docs/2.2.0/concepts/server-events.html
+++ b/docs/2.2.0/concepts/server-events.html
@@ -4,7 +4,7 @@
Server events | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/sessions.html b/docs/2.2.0/concepts/sessions.html
index bb69acae4d..f481538a96 100644
--- a/docs/2.2.0/concepts/sessions.html
+++ b/docs/2.2.0/concepts/sessions.html
@@ -4,7 +4,7 @@
Sessions | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/streams.html b/docs/2.2.0/concepts/streams.html
index 53f0896df3..68fb1ba857 100644
--- a/docs/2.2.0/concepts/streams.html
+++ b/docs/2.2.0/concepts/streams.html
@@ -4,7 +4,7 @@
Streams | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/testing/advanced-examples.html b/docs/2.2.0/concepts/testing/advanced-examples.html
index 5ba34bac94..79aaac5f8a 100644
--- a/docs/2.2.0/concepts/testing/advanced-examples.html
+++ b/docs/2.2.0/concepts/testing/advanced-examples.html
@@ -4,7 +4,7 @@
Advanced examples | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/testing/best-practises.html b/docs/2.2.0/concepts/testing/best-practises.html
index 6a39242dd0..9dec15d96e 100644
--- a/docs/2.2.0/concepts/testing/best-practises.html
+++ b/docs/2.2.0/concepts/testing/best-practises.html
@@ -4,7 +4,7 @@
Best practises | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/testing/get-started.html b/docs/2.2.0/concepts/testing/get-started.html
index 5391f402c6..2e0503a5ed 100644
--- a/docs/2.2.0/concepts/testing/get-started.html
+++ b/docs/2.2.0/concepts/testing/get-started.html
@@ -4,7 +4,7 @@
Get started | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/testing/the-basics.html b/docs/2.2.0/concepts/testing/the-basics.html
index 357fe7ae80..4c5501a81f 100644
--- a/docs/2.2.0/concepts/testing/the-basics.html
+++ b/docs/2.2.0/concepts/testing/the-basics.html
@@ -4,7 +4,7 @@
The basics | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/webserver.html b/docs/2.2.0/concepts/webserver.html
index dcbed57a95..90560a7e59 100644
--- a/docs/2.2.0/concepts/webserver.html
+++ b/docs/2.2.0/concepts/webserver.html
@@ -4,7 +4,7 @@
Web server | Serverpod
-
+
diff --git a/docs/2.2.0/concepts/working-with-endpoints.html b/docs/2.2.0/concepts/working-with-endpoints.html
index 6d17101bef..4d637a3cea 100644
--- a/docs/2.2.0/concepts/working-with-endpoints.html
+++ b/docs/2.2.0/concepts/working-with-endpoints.html
@@ -4,7 +4,7 @@
Working with endpoints | Serverpod
-
+
diff --git a/docs/2.2.0/contribute.html b/docs/2.2.0/contribute.html
index 22656333bb..c5432a33be 100644
--- a/docs/2.2.0/contribute.html
+++ b/docs/2.2.0/contribute.html
@@ -4,7 +4,7 @@
Roadmap & contributions | Serverpod
-
+
diff --git a/docs/2.2.0/deployments/deploying-to-aws.html b/docs/2.2.0/deployments/deploying-to-aws.html
index 6ff13c8b58..a08261c4a6 100644
--- a/docs/2.2.0/deployments/deploying-to-aws.html
+++ b/docs/2.2.0/deployments/deploying-to-aws.html
@@ -4,7 +4,7 @@
AWS EC2 with Terraform | Serverpod
-
+
diff --git a/docs/2.2.0/deployments/deploying-to-gce-terraform.html b/docs/2.2.0/deployments/deploying-to-gce-terraform.html
index f9ca9848f6..e300c81662 100644
--- a/docs/2.2.0/deployments/deploying-to-gce-terraform.html
+++ b/docs/2.2.0/deployments/deploying-to-gce-terraform.html
@@ -4,7 +4,7 @@
Google Cloud Engine with Terraform | Serverpod
-
+
diff --git a/docs/2.2.0/deployments/deploying-to-gcr-console.html b/docs/2.2.0/deployments/deploying-to-gcr-console.html
index 36bf552111..20f60de6ce 100644
--- a/docs/2.2.0/deployments/deploying-to-gcr-console.html
+++ b/docs/2.2.0/deployments/deploying-to-gcr-console.html
@@ -4,7 +4,7 @@
Google Cloud Run with CGP Console | Serverpod
-
+
diff --git a/docs/2.2.0/deployments/deployment-strategy.html b/docs/2.2.0/deployments/deployment-strategy.html
index e574516bc3..af16f741ce 100644
--- a/docs/2.2.0/deployments/deployment-strategy.html
+++ b/docs/2.2.0/deployments/deployment-strategy.html
@@ -4,7 +4,7 @@
Choosing deployment strategy | Serverpod
-
+
diff --git a/docs/2.2.0/deployments/general.html b/docs/2.2.0/deployments/general.html
index 7c4a1f54ce..90fe158d26 100644
--- a/docs/2.2.0/deployments/general.html
+++ b/docs/2.2.0/deployments/general.html
@@ -4,7 +4,7 @@
Hosting elsewhere | Serverpod
-
+
diff --git a/docs/2.2.0/get-started-with-mini.html b/docs/2.2.0/get-started-with-mini.html
index a69f058efa..86aa4b848a 100644
--- a/docs/2.2.0/get-started-with-mini.html
+++ b/docs/2.2.0/get-started-with-mini.html
@@ -4,7 +4,7 @@
Get started with Mini | Serverpod
-
+
diff --git a/docs/2.2.0/get-started.html b/docs/2.2.0/get-started.html
index f1e8207743..c8199de125 100644
--- a/docs/2.2.0/get-started.html
+++ b/docs/2.2.0/get-started.html
@@ -4,7 +4,7 @@
Get started | Serverpod
-
+
diff --git a/docs/2.2.0/support.html b/docs/2.2.0/support.html
index 3f438b9f30..65873aa6ce 100644
--- a/docs/2.2.0/support.html
+++ b/docs/2.2.0/support.html
@@ -4,7 +4,7 @@
Support & community | Serverpod
-
+
diff --git a/docs/2.2.0/tools/insights.html b/docs/2.2.0/tools/insights.html
index d4b7a41f27..7c2355df4f 100644
--- a/docs/2.2.0/tools/insights.html
+++ b/docs/2.2.0/tools/insights.html
@@ -4,7 +4,7 @@
Serverpod Insights | Serverpod
-
+
diff --git a/docs/2.2.0/tools/lsp.html b/docs/2.2.0/tools/lsp.html
index 7e725f924b..af686575d3 100644
--- a/docs/2.2.0/tools/lsp.html
+++ b/docs/2.2.0/tools/lsp.html
@@ -4,7 +4,7 @@
LSP server | Serverpod
-
+
diff --git a/docs/2.2.0/tutorials/authentication.html b/docs/2.2.0/tutorials/authentication.html
index e5410c4bd3..02af9521ed 100644
--- a/docs/2.2.0/tutorials/authentication.html
+++ b/docs/2.2.0/tutorials/authentication.html
@@ -4,7 +4,7 @@
Authentication | Serverpod
-
+
diff --git a/docs/2.2.0/tutorials/code-example.html b/docs/2.2.0/tutorials/code-example.html
index 827ce86562..d5ccb54926 100644
--- a/docs/2.2.0/tutorials/code-example.html
+++ b/docs/2.2.0/tutorials/code-example.html
@@ -4,7 +4,7 @@
Code examples | Serverpod
-
+
diff --git a/docs/2.2.0/tutorials/first-app.html b/docs/2.2.0/tutorials/first-app.html
index 28278e5440..38d264e42e 100644
--- a/docs/2.2.0/tutorials/first-app.html
+++ b/docs/2.2.0/tutorials/first-app.html
@@ -4,7 +4,7 @@
Build your first app | Serverpod
-
+
diff --git a/docs/2.2.0/tutorials/real-time-communication.html b/docs/2.2.0/tutorials/real-time-communication.html
index c248d4f3a5..7163e6a83e 100644
--- a/docs/2.2.0/tutorials/real-time-communication.html
+++ b/docs/2.2.0/tutorials/real-time-communication.html
@@ -4,7 +4,7 @@
Real-time communication | Serverpod
-
+
diff --git a/docs/2.2.0/upgrading/upgrade-from-mini.html b/docs/2.2.0/upgrading/upgrade-from-mini.html
index da1415156f..6ab17dc7d8 100644
--- a/docs/2.2.0/upgrading/upgrade-from-mini.html
+++ b/docs/2.2.0/upgrading/upgrade-from-mini.html
@@ -4,7 +4,7 @@
Upgrade from Mini to full | Serverpod
-
+
diff --git a/docs/2.2.0/upgrading/upgrade-to-one-point-two.html b/docs/2.2.0/upgrading/upgrade-to-one-point-two.html
index 65c5add646..dd193e3953 100644
--- a/docs/2.2.0/upgrading/upgrade-to-one-point-two.html
+++ b/docs/2.2.0/upgrading/upgrade-to-one-point-two.html
@@ -4,7 +4,7 @@
Upgrade to 1.2 | Serverpod
-
+
diff --git a/docs/2.2.0/upgrading/upgrade-to-two-point-two.html b/docs/2.2.0/upgrading/upgrade-to-two-point-two.html
index 2dea9a48e0..8ee2a183ce 100644
--- a/docs/2.2.0/upgrading/upgrade-to-two-point-two.html
+++ b/docs/2.2.0/upgrading/upgrade-to-two-point-two.html
@@ -4,7 +4,7 @@
Upgrade to 2.2 | Serverpod
-
+
diff --git a/docs/2.2.0/upgrading/upgrade-to-two.html b/docs/2.2.0/upgrading/upgrade-to-two.html
index 5b5eab94ca..787bbf9f5a 100644
--- a/docs/2.2.0/upgrading/upgrade-to-two.html
+++ b/docs/2.2.0/upgrading/upgrade-to-two.html
@@ -4,7 +4,7 @@
Upgrade to 2.0 | Serverpod
-
+
diff --git a/docs/404.html b/docs/404.html
index 731abe5c26..58a19bcd8e 100644
--- a/docs/404.html
+++ b/docs/404.html
@@ -4,7 +4,7 @@
Serverpod
-
+
diff --git a/docs/assets/js/2890c80c.2d156f2f.js b/docs/assets/js/2890c80c.2d156f2f.js
new file mode 100644
index 0000000000..d634524ac6
--- /dev/null
+++ b/docs/assets/js/2890c80c.2d156f2f.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkserverpod_docs=self.webpackChunkserverpod_docs||[]).push([[6308],{85986:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"concepts/authentication/basics","title":"The basics","description":"Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the serverpod_auth module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood.","source":"@site/versioned_docs/version-2.1.0/06-concepts/11-authentication/02-basics.md","sourceDirName":"06-concepts/11-authentication","slug":"/concepts/authentication/basics","permalink":"/2.1.0/concepts/authentication/basics","draft":false,"unlisted":false,"editUrl":"https://github.com/serverpod/serverpod_docs/tree/main/versioned_docs/version-2.1.0/06-concepts/11-authentication/02-basics.md","tags":[],"version":"2.1.0","sidebarPosition":2,"frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Setup","permalink":"/2.1.0/concepts/authentication/setup"},"next":{"title":"Working with users","permalink":"/2.1.0/concepts/authentication/working-with-users"}}');var o=s(74848),i=s(28453);const r={},c="The basics",a={},d=[{value:"Requiring authentication on endpoints",id:"requiring-authentication-on-endpoints",level:2},{value:"Authorization on endpoints",id:"authorization-on-endpoints",level:2},{value:"Managing scopes",id:"managing-scopes",level:3},{value:"Custom scopes",id:"custom-scopes",level:3}];function u(e){const n={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"the-basics",children:"The basics"})}),"\n",(0,o.jsxs)(n.p,{children:["Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the ",(0,o.jsx)(n.code,{children:"serverpod_auth"})," module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"Session"})," object provides information about the current user. A unique ",(0,o.jsx)(n.code,{children:"userId"})," identifies a user. You should use this id whenever you a referring to a user. Access the id of a signed-in user through the ",(0,o.jsx)(n.code,{children:"authenticated"})," asynchronous getter of the ",(0,o.jsx)(n.code,{children:"Session"})," object."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-dart",children:"Future myMethod(Session session) async {\n final authenticationInfo = await session.authenticated;\n final userId = authenticationInfo?.userId;\n ...\n}\n"})}),"\n",(0,o.jsx)(n.p,{children:"You can also use the Session object to check if a user is authenticated:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-dart",children:"Future myMethod(Session session) async {\n var isSignedIn = await session.isUserSignedIn;\n ...\n}\n"})}),"\n",(0,o.jsx)(n.h2,{id:"requiring-authentication-on-endpoints",children:"Requiring authentication on endpoints"}),"\n",(0,o.jsxs)(n.p,{children:["It is common to want to restrict access to an endpoint to users that have signed in. You can do this by overriding the ",(0,o.jsx)(n.code,{children:"requireLogin"})," property of the ",(0,o.jsx)(n.code,{children:"Endpoint"})," class."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,o.jsx)(n.h2,{id:"authorization-on-endpoints",children:"Authorization on endpoints"}),"\n",(0,o.jsxs)(n.p,{children:["Serverpod also supports scopes for restricting access. One or more scopes can be associated with a user. For instance, this can be used to give admin access to a specific user. To restrict access for an endpoint, override the ",(0,o.jsx)(n.code,{children:"requiredScopes"})," property. Note that setting ",(0,o.jsx)(n.code,{children:"requiredScopes"})," implicitly sets ",(0,o.jsx)(n.code,{children:"requireLogin"})," to true."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n @override\n Set get requiredScopes => {Scope.admin};\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,o.jsx)(n.h3,{id:"managing-scopes",children:"Managing scopes"}),"\n",(0,o.jsxs)(n.p,{children:["New users are created without any scopes. To update a user's scopes, use the ",(0,o.jsx)(n.code,{children:"Users"})," class's ",(0,o.jsx)(n.code,{children:"updateUserScopes"})," method (requires the ",(0,o.jsx)(n.code,{children:"serverpod_auth_server"})," package). This method replaces all previously stored scopes."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-dart",children:"await Users.updateUserScopes(session, userId, {Scope.admin});\n"})}),"\n",(0,o.jsx)(n.h3,{id:"custom-scopes",children:"Custom scopes"}),"\n",(0,o.jsx)(n.p,{children:"You may need more granular access control for specific endpoints. To create custom scopes, extend the Scope class, as shown below:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-dart",children:"class CustomScope extends Scope {\n const CustomScope(String name) : super(name);\n\n static const userRead = CustomScope('userRead');\n static const userWrite = CustomScope('userWrite');\n}\n"})}),"\n",(0,o.jsx)(n.p,{children:"Then use the custom scopes like this:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n @override\n Set get requiredScopes => {CustomScope.userRead, CustomScope.userWrite};\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,o.jsx)(n.admonition,{type:"caution",children:(0,o.jsx)(n.p,{children:"Keep in mind that a scope is merely an arbitrary string and can be written in any format you prefer. However, it's crucial to use unique strings for each scope, as duplicated scope strings may lead to unintentional data exposure."})})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>c});var t=s(96540);const o={},i=t.createContext(o);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/docs/assets/js/2890c80c.5f3e0e5b.js b/docs/assets/js/2890c80c.5f3e0e5b.js
deleted file mode 100644
index 4078e586d7..0000000000
--- a/docs/assets/js/2890c80c.5f3e0e5b.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkserverpod_docs=self.webpackChunkserverpod_docs||[]).push([[6308],{85986:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"concepts/authentication/basics","title":"The basics","description":"Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the serverpod_auth module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood.","source":"@site/versioned_docs/version-2.1.0/06-concepts/11-authentication/02-basics.md","sourceDirName":"06-concepts/11-authentication","slug":"/concepts/authentication/basics","permalink":"/2.1.0/concepts/authentication/basics","draft":false,"unlisted":false,"editUrl":"https://github.com/serverpod/serverpod_docs/tree/main/versioned_docs/version-2.1.0/06-concepts/11-authentication/02-basics.md","tags":[],"version":"2.1.0","sidebarPosition":2,"frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Setup","permalink":"/2.1.0/concepts/authentication/setup"},"next":{"title":"Working with users","permalink":"/2.1.0/concepts/authentication/working-with-users"}}');var o=s(74848),i=s(28453);const r={},c="The basics",a={},d=[{value:"Requiring authentication on endpoints",id:"requiring-authentication-on-endpoints",level:2},{value:"Authorization on endpoints",id:"authorization-on-endpoints",level:2},{value:"Managing scopes",id:"managing-scopes",level:3},{value:"Custom scopes",id:"custom-scopes",level:3}];function u(e){const n={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"the-basics",children:"The basics"})}),"\n",(0,o.jsxs)(n.p,{children:["Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the ",(0,o.jsx)(n.code,{children:"serverpod_auth"})," module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"Session"})," object provides information about the current user. A unique ",(0,o.jsx)(n.code,{children:"userId"})," identifies a user. You should use this id whenever you a referring to a user. Access the id of a signed-in user through the ",(0,o.jsx)(n.code,{children:"auth"})," field of the ",(0,o.jsx)(n.code,{children:"Session"})," object."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-dart",children:"Future myMethod(Session session) async {\n var userId = await session.auth.authenticatedUserId;\n ...\n}\n"})}),"\n",(0,o.jsx)(n.p,{children:"You can also use the Session object to check if a user is authenticated:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-dart",children:"Future myMethod(Session session) async {\n var isSignedIn = await session.isUserSignedIn;\n ...\n}\n"})}),"\n",(0,o.jsx)(n.h2,{id:"requiring-authentication-on-endpoints",children:"Requiring authentication on endpoints"}),"\n",(0,o.jsxs)(n.p,{children:["It is common to want to restrict access to an endpoint to users that have signed in. You can do this by overriding the ",(0,o.jsx)(n.code,{children:"requireLogin"})," property of the ",(0,o.jsx)(n.code,{children:"Endpoint"})," class."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,o.jsx)(n.h2,{id:"authorization-on-endpoints",children:"Authorization on endpoints"}),"\n",(0,o.jsxs)(n.p,{children:["Serverpod also supports scopes for restricting access. One or more scopes can be associated with a user. For instance, this can be used to give admin access to a specific user. To restrict access for an endpoint, override the ",(0,o.jsx)(n.code,{children:"requiredScopes"})," property. Note that setting ",(0,o.jsx)(n.code,{children:"requiredScopes"})," implicitly sets ",(0,o.jsx)(n.code,{children:"requireLogin"})," to true."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n @override\n Set get requiredScopes => {Scope.admin};\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,o.jsx)(n.h3,{id:"managing-scopes",children:"Managing scopes"}),"\n",(0,o.jsxs)(n.p,{children:["New users are created without any scopes. To update a user's scopes, use the ",(0,o.jsx)(n.code,{children:"Users"})," class's ",(0,o.jsx)(n.code,{children:"updateUserScopes"})," method (requires the ",(0,o.jsx)(n.code,{children:"serverpod_auth_server"})," package). This method replaces all previously stored scopes."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-dart",children:"await Users.updateUserScopes(session, userId, {Scope.admin});\n"})}),"\n",(0,o.jsx)(n.h3,{id:"custom-scopes",children:"Custom scopes"}),"\n",(0,o.jsx)(n.p,{children:"You may need more granular access control for specific endpoints. To create custom scopes, extend the Scope class, as shown below:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-dart",children:"class CustomScope extends Scope {\n const CustomScope(String name) : super(name);\n\n static const userRead = CustomScope('userRead');\n static const userWrite = CustomScope('userWrite');\n}\n"})}),"\n",(0,o.jsx)(n.p,{children:"Then use the custom scopes like this:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n @override\n Set get requiredScopes => {CustomScope.userRead, CustomScope.userWrite};\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,o.jsx)(n.admonition,{type:"caution",children:(0,o.jsx)(n.p,{children:"Keep in mind that a scope is merely an arbitrary string and can be written in any format you prefer. However, it's crucial to use unique strings for each scope, as duplicated scope strings may lead to unintentional data exposure."})})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>c});var t=s(96540);const o={},i=t.createContext(o);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/docs/assets/js/2a36564f.5b900962.js b/docs/assets/js/2a36564f.c67865e5.js
similarity index 52%
rename from docs/assets/js/2a36564f.5b900962.js
rename to docs/assets/js/2a36564f.c67865e5.js
index a6230eb0d2..06220cb11e 100644
--- a/docs/assets/js/2a36564f.5b900962.js
+++ b/docs/assets/js/2a36564f.c67865e5.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkserverpod_docs=self.webpackChunkserverpod_docs||[]).push([[27800],{9086:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"concepts/authentication/basics","title":"The basics","description":"Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the serverpod_auth module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood.","source":"@site/versioned_docs/version-2.2.0/06-concepts/11-authentication/02-basics.md","sourceDirName":"06-concepts/11-authentication","slug":"/concepts/authentication/basics","permalink":"/2.2.0/concepts/authentication/basics","draft":false,"unlisted":false,"editUrl":"https://github.com/serverpod/serverpod_docs/tree/main/versioned_docs/version-2.2.0/06-concepts/11-authentication/02-basics.md","tags":[],"version":"2.2.0","sidebarPosition":2,"frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Setup","permalink":"/2.2.0/concepts/authentication/setup"},"next":{"title":"Working with users","permalink":"/2.2.0/concepts/authentication/working-with-users"}}');var t=s(74848),o=s(28453);const r={},a="The basics",c={},d=[{value:"Requiring authentication on endpoints",id:"requiring-authentication-on-endpoints",level:2},{value:"Authorization on endpoints",id:"authorization-on-endpoints",level:2},{value:"Managing scopes",id:"managing-scopes",level:3},{value:"Custom scopes",id:"custom-scopes",level:3},{value:"User authentication",id:"user-authentication",level:2},{value:"Sign out device",id:"sign-out-device",level:4},{value:"Sign out all devices",id:"sign-out-all-devices",level:4}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",mdxAdmonitionTitle:"mdxAdmonitionTitle",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"the-basics",children:"The basics"})}),"\n",(0,t.jsxs)(n.p,{children:["Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the ",(0,t.jsx)(n.code,{children:"serverpod_auth"})," module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"Session"})," object provides information about the current user. A unique ",(0,t.jsx)(n.code,{children:"userId"})," identifies a user. You should use this id whenever you a referring to a user. Access the id of a signed-in user through the ",(0,t.jsx)(n.code,{children:"authenticated"})," field of the ",(0,t.jsx)(n.code,{children:"Session"})," object."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"Future myMethod(Session session) async {\n var userId = (await session.authenticated)?.userId;\n ...\n}\n"})}),"\n",(0,t.jsx)(n.p,{children:"You can also use the Session object to check if a user is authenticated:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"Future myMethod(Session session) async {\n var isSignedIn = await session.isUserSignedIn;\n ...\n}\n"})}),"\n",(0,t.jsx)(n.h2,{id:"requiring-authentication-on-endpoints",children:"Requiring authentication on endpoints"}),"\n",(0,t.jsxs)(n.p,{children:["It is common to want to restrict access to an endpoint to users that have signed in. You can do this by overriding the ",(0,t.jsx)(n.code,{children:"requireLogin"})," property of the ",(0,t.jsx)(n.code,{children:"Endpoint"})," class."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,t.jsx)(n.h2,{id:"authorization-on-endpoints",children:"Authorization on endpoints"}),"\n",(0,t.jsxs)(n.p,{children:["Serverpod also supports scopes for restricting access. One or more scopes can be associated with a user. For instance, this can be used to give admin access to a specific user. To restrict access for an endpoint, override the ",(0,t.jsx)(n.code,{children:"requiredScopes"})," property. Note that setting ",(0,t.jsx)(n.code,{children:"requiredScopes"})," implicitly sets ",(0,t.jsx)(n.code,{children:"requireLogin"})," to true."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n @override\n Set get requiredScopes => {Scope.admin};\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,t.jsx)(n.h3,{id:"managing-scopes",children:"Managing scopes"}),"\n",(0,t.jsxs)(n.p,{children:["New users are created without any scopes. To update a user's scopes, use the ",(0,t.jsx)(n.code,{children:"Users"})," class's ",(0,t.jsx)(n.code,{children:"updateUserScopes"})," method (requires the ",(0,t.jsx)(n.code,{children:"serverpod_auth_server"})," package). This method replaces all previously stored scopes."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"await Users.updateUserScopes(session, userId, {Scope.admin});\n"})}),"\n",(0,t.jsx)(n.h3,{id:"custom-scopes",children:"Custom scopes"}),"\n",(0,t.jsx)(n.p,{children:"You may need more granular access control for specific endpoints. To create custom scopes, extend the Scope class, as shown below:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"class CustomScope extends Scope {\n const CustomScope(String name) : super(name);\n\n static const userRead = CustomScope('userRead');\n static const userWrite = CustomScope('userWrite');\n}\n"})}),"\n",(0,t.jsx)(n.p,{children:"Then use the custom scopes like this:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n @override\n Set get requiredScopes => {CustomScope.userRead, CustomScope.userWrite};\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"caution",children:(0,t.jsx)(n.p,{children:"Keep in mind that a scope is merely an arbitrary string and can be written in any format you prefer. However, it's crucial to use unique strings for each scope, as duplicated scope strings may lead to unintentional data exposure."})}),"\n",(0,t.jsx)(n.h2,{id:"user-authentication",children:"User authentication"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"StatusEndpoint"})," class includes methods for handling user sign-outs, whether from a single device or all devices."]}),"\n",(0,t.jsxs)(n.admonition,{type:"info",children:[(0,t.jsxs)(n.p,{children:["In addition to the ",(0,t.jsx)(n.code,{children:"StatusEndpoint"})," methods, Serverpod provides more comprehensive tools for managing user authentication and sign-out processes across multiple devices."]}),(0,t.jsxs)(n.p,{children:["For more detailed information on managing and revoking authentication keys, please refer to the ",(0,t.jsx)(n.a,{href:"providers/custom-providers#revoking-authentication-keys",children:"Revoking authentication keys"})," section."]})]}),"\n",(0,t.jsx)(n.h4,{id:"sign-out-device",children:"Sign out device"}),"\n",(0,t.jsx)(n.p,{children:"To sign out a single device:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"await client.modules.auth.status.signOutDevice();\n"})}),"\n",(0,t.jsx)(n.p,{children:"This status endpoint method obtains the authentication key from session's authentication information, then revokes that key."}),"\n",(0,t.jsx)(n.h4,{id:"sign-out-all-devices",children:"Sign out all devices"}),"\n",(0,t.jsx)(n.p,{children:"To sign the user out across all devices:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"await client.modules.auth.status.signOutAllDevices();\n"})}),"\n",(0,t.jsx)(n.p,{children:"This status endpoint retrieves the user ID from session's authentication information, then revokes all authentication keys related to that user."}),"\n",(0,t.jsxs)(n.admonition,{type:"info",children:[(0,t.jsx)(n.mdxAdmonitionTitle,{}),(0,t.jsx)("span",{id:"deprecated-signout-endpoint"}),(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"signOut"})," status endpoint is deprecated. Use ",(0,t.jsx)(n.code,{children:"signOutDevice"})," or ",(0,t.jsx)(n.code,{children:"signOutAllDevices"})," instead."]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"await client.modules.auth.status.signOut(); // Deprecated\n"})}),(0,t.jsxs)(n.p,{children:["The behavior of ",(0,t.jsx)(n.code,{children:"signOut"})," is controlled by ",(0,t.jsx)(n.code,{children:"legacyUserSignOutBehavior"}),", which you can adjust in the ",(0,t.jsx)(n.a,{href:"setup#configure-authentication",children:"configure authentication"})," section. This allows you to control the signout behaviour of already shipped clients."]})]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>a});var i=s(96540);const t={},o=i.createContext(t);function r(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkserverpod_docs=self.webpackChunkserverpod_docs||[]).push([[27800],{9086:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"concepts/authentication/basics","title":"The basics","description":"Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the serverpod_auth module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood.","source":"@site/versioned_docs/version-2.2.0/06-concepts/11-authentication/02-basics.md","sourceDirName":"06-concepts/11-authentication","slug":"/concepts/authentication/basics","permalink":"/2.2.0/concepts/authentication/basics","draft":false,"unlisted":false,"editUrl":"https://github.com/serverpod/serverpod_docs/tree/main/versioned_docs/version-2.2.0/06-concepts/11-authentication/02-basics.md","tags":[],"version":"2.2.0","sidebarPosition":2,"frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Setup","permalink":"/2.2.0/concepts/authentication/setup"},"next":{"title":"Working with users","permalink":"/2.2.0/concepts/authentication/working-with-users"}}');var i=s(74848),o=s(28453);const r={},a="The basics",c={},d=[{value:"Requiring authentication on endpoints",id:"requiring-authentication-on-endpoints",level:2},{value:"Authorization on endpoints",id:"authorization-on-endpoints",level:2},{value:"Managing scopes",id:"managing-scopes",level:3},{value:"Custom scopes",id:"custom-scopes",level:3},{value:"User authentication",id:"user-authentication",level:2},{value:"Sign out device",id:"sign-out-device",level:4},{value:"Sign out all devices",id:"sign-out-all-devices",level:4}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",mdxAdmonitionTitle:"mdxAdmonitionTitle",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"the-basics",children:"The basics"})}),"\n",(0,i.jsxs)(n.p,{children:["Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the ",(0,i.jsx)(n.code,{children:"serverpod_auth"})," module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood."]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"Session"})," object provides information about the current user. A unique ",(0,i.jsx)(n.code,{children:"userId"})," identifies a user. You should use this id whenever you a referring to a user. Access the id of a signed-in user through the ",(0,i.jsx)(n.code,{children:"authenticated"})," asynchronous getter of the ",(0,i.jsx)(n.code,{children:"Session"})," object."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"Future myMethod(Session session) async {\n final authenticationInfo = await session.authenticated;\n final userId = authenticationInfo?.userId;\n ...\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"You can also use the Session object to check if a user is authenticated:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"Future myMethod(Session session) async {\n var isSignedIn = await session.isUserSignedIn;\n ...\n}\n"})}),"\n",(0,i.jsx)(n.h2,{id:"requiring-authentication-on-endpoints",children:"Requiring authentication on endpoints"}),"\n",(0,i.jsxs)(n.p,{children:["It is common to want to restrict access to an endpoint to users that have signed in. You can do this by overriding the ",(0,i.jsx)(n.code,{children:"requireLogin"})," property of the ",(0,i.jsx)(n.code,{children:"Endpoint"})," class."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,i.jsx)(n.h2,{id:"authorization-on-endpoints",children:"Authorization on endpoints"}),"\n",(0,i.jsxs)(n.p,{children:["Serverpod also supports scopes for restricting access. One or more scopes can be associated with a user. For instance, this can be used to give admin access to a specific user. To restrict access for an endpoint, override the ",(0,i.jsx)(n.code,{children:"requiredScopes"})," property. Note that setting ",(0,i.jsx)(n.code,{children:"requiredScopes"})," implicitly sets ",(0,i.jsx)(n.code,{children:"requireLogin"})," to true."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n @override\n Set get requiredScopes => {Scope.admin};\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,i.jsx)(n.h3,{id:"managing-scopes",children:"Managing scopes"}),"\n",(0,i.jsxs)(n.p,{children:["New users are created without any scopes. To update a user's scopes, use the ",(0,i.jsx)(n.code,{children:"Users"})," class's ",(0,i.jsx)(n.code,{children:"updateUserScopes"})," method (requires the ",(0,i.jsx)(n.code,{children:"serverpod_auth_server"})," package). This method replaces all previously stored scopes."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"await Users.updateUserScopes(session, userId, {Scope.admin});\n"})}),"\n",(0,i.jsx)(n.h3,{id:"custom-scopes",children:"Custom scopes"}),"\n",(0,i.jsx)(n.p,{children:"You may need more granular access control for specific endpoints. To create custom scopes, extend the Scope class, as shown below:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"class CustomScope extends Scope {\n const CustomScope(String name) : super(name);\n\n static const userRead = CustomScope('userRead');\n static const userWrite = CustomScope('userWrite');\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"Then use the custom scopes like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n @override\n Set get requiredScopes => {CustomScope.userRead, CustomScope.userWrite};\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"caution",children:(0,i.jsx)(n.p,{children:"Keep in mind that a scope is merely an arbitrary string and can be written in any format you prefer. However, it's crucial to use unique strings for each scope, as duplicated scope strings may lead to unintentional data exposure."})}),"\n",(0,i.jsx)(n.h2,{id:"user-authentication",children:"User authentication"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"StatusEndpoint"})," class includes methods for handling user sign-outs, whether from a single device or all devices."]}),"\n",(0,i.jsxs)(n.admonition,{type:"info",children:[(0,i.jsxs)(n.p,{children:["In addition to the ",(0,i.jsx)(n.code,{children:"StatusEndpoint"})," methods, Serverpod provides more comprehensive tools for managing user authentication and sign-out processes across multiple devices."]}),(0,i.jsxs)(n.p,{children:["For more detailed information on managing and revoking authentication keys, please refer to the ",(0,i.jsx)(n.a,{href:"providers/custom-providers#revoking-authentication-keys",children:"Revoking authentication keys"})," section."]})]}),"\n",(0,i.jsx)(n.h4,{id:"sign-out-device",children:"Sign out device"}),"\n",(0,i.jsx)(n.p,{children:"To sign out a single device:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"await client.modules.auth.status.signOutDevice();\n"})}),"\n",(0,i.jsx)(n.p,{children:"This status endpoint method obtains the authentication key from session's authentication information, then revokes that key."}),"\n",(0,i.jsx)(n.h4,{id:"sign-out-all-devices",children:"Sign out all devices"}),"\n",(0,i.jsx)(n.p,{children:"To sign the user out across all devices:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"await client.modules.auth.status.signOutAllDevices();\n"})}),"\n",(0,i.jsx)(n.p,{children:"This status endpoint retrieves the user ID from session's authentication information, then revokes all authentication keys related to that user."}),"\n",(0,i.jsxs)(n.admonition,{type:"info",children:[(0,i.jsx)(n.mdxAdmonitionTitle,{}),(0,i.jsx)("span",{id:"deprecated-signout-endpoint"}),(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"signOut"})," status endpoint is deprecated. Use ",(0,i.jsx)(n.code,{children:"signOutDevice"})," or ",(0,i.jsx)(n.code,{children:"signOutAllDevices"})," instead."]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"await client.modules.auth.status.signOut(); // Deprecated\n"})}),(0,i.jsxs)(n.p,{children:["The behavior of ",(0,i.jsx)(n.code,{children:"signOut"})," is controlled by ",(0,i.jsx)(n.code,{children:"legacyUserSignOutBehavior"}),", which you can adjust in the ",(0,i.jsx)(n.a,{href:"setup#configure-authentication",children:"configure authentication"})," section. This allows you to control the signout behaviour of already shipped clients."]})]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>a});var t=s(96540);const i={},o=t.createContext(i);function r(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/docs/assets/js/5144cf5e.2fa57623.js b/docs/assets/js/5144cf5e.0930c9ed.js
similarity index 96%
rename from docs/assets/js/5144cf5e.2fa57623.js
rename to docs/assets/js/5144cf5e.0930c9ed.js
index 65f67835ab..91d40f456a 100644
--- a/docs/assets/js/5144cf5e.2fa57623.js
+++ b/docs/assets/js/5144cf5e.0930c9ed.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkserverpod_docs=self.webpackChunkserverpod_docs||[]).push([[58800],{17059:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"concepts/authentication/basics","title":"The basics","description":"Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the serverpod_auth module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood.","source":"@site/docs/06-concepts/11-authentication/02-basics.md","sourceDirName":"06-concepts/11-authentication","slug":"/concepts/authentication/basics","permalink":"/next/concepts/authentication/basics","draft":false,"unlisted":false,"editUrl":"https://github.com/serverpod/serverpod_docs/tree/main/docs/06-concepts/11-authentication/02-basics.md","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Setup","permalink":"/next/concepts/authentication/setup"},"next":{"title":"Working with users","permalink":"/next/concepts/authentication/working-with-users"}}');var i=s(74848),o=s(28453);const r={},a="The basics",c={},d=[{value:"Requiring authentication on endpoints",id:"requiring-authentication-on-endpoints",level:2},{value:"Authorization on endpoints",id:"authorization-on-endpoints",level:2},{value:"Managing scopes",id:"managing-scopes",level:3},{value:"Custom scopes",id:"custom-scopes",level:3},{value:"User authentication",id:"user-authentication",level:2},{value:"Sign out device",id:"sign-out-device",level:4},{value:"Sign out all devices",id:"sign-out-all-devices",level:4}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",mdxAdmonitionTitle:"mdxAdmonitionTitle",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"the-basics",children:"The basics"})}),"\n",(0,i.jsxs)(n.p,{children:["Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the ",(0,i.jsx)(n.code,{children:"serverpod_auth"})," module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood."]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"Session"})," object provides information about the current user. A unique ",(0,i.jsx)(n.code,{children:"userId"})," identifies a user. You should use this id whenever you a referring to a user. Access the id of a signed-in user through the ",(0,i.jsx)(n.code,{children:"authenticated"})," field of the ",(0,i.jsx)(n.code,{children:"Session"})," object."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"Future myMethod(Session session) async {\n var userId = (await session.authenticated)?.userId;\n ...\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"You can also use the Session object to check if a user is authenticated:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"Future myMethod(Session session) async {\n var isSignedIn = await session.isUserSignedIn;\n ...\n}\n"})}),"\n",(0,i.jsx)(n.h2,{id:"requiring-authentication-on-endpoints",children:"Requiring authentication on endpoints"}),"\n",(0,i.jsxs)(n.p,{children:["It is common to want to restrict access to an endpoint to users that have signed in. You can do this by overriding the ",(0,i.jsx)(n.code,{children:"requireLogin"})," property of the ",(0,i.jsx)(n.code,{children:"Endpoint"})," class."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,i.jsx)(n.h2,{id:"authorization-on-endpoints",children:"Authorization on endpoints"}),"\n",(0,i.jsxs)(n.p,{children:["Serverpod also supports scopes for restricting access. One or more scopes can be associated with a user. For instance, this can be used to give admin access to a specific user. To restrict access for an endpoint, override the ",(0,i.jsx)(n.code,{children:"requiredScopes"})," property. Note that setting ",(0,i.jsx)(n.code,{children:"requiredScopes"})," implicitly sets ",(0,i.jsx)(n.code,{children:"requireLogin"})," to true."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n @override\n Set get requiredScopes => {Scope.admin};\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,i.jsx)(n.h3,{id:"managing-scopes",children:"Managing scopes"}),"\n",(0,i.jsxs)(n.p,{children:["New users are created without any scopes. To update a user's scopes, use the ",(0,i.jsx)(n.code,{children:"Users"})," class's ",(0,i.jsx)(n.code,{children:"updateUserScopes"})," method (requires the ",(0,i.jsx)(n.code,{children:"serverpod_auth_server"})," package). This method replaces all previously stored scopes."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"await Users.updateUserScopes(session, userId, {Scope.admin});\n"})}),"\n",(0,i.jsx)(n.h3,{id:"custom-scopes",children:"Custom scopes"}),"\n",(0,i.jsx)(n.p,{children:"You may need more granular access control for specific endpoints. To create custom scopes, extend the Scope class, as shown below:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"class CustomScope extends Scope {\n const CustomScope(String name) : super(name);\n\n static const userRead = CustomScope('userRead');\n static const userWrite = CustomScope('userWrite');\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"Then use the custom scopes like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n @override\n Set get requiredScopes => {CustomScope.userRead, CustomScope.userWrite};\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"caution",children:(0,i.jsx)(n.p,{children:"Keep in mind that a scope is merely an arbitrary string and can be written in any format you prefer. However, it's crucial to use unique strings for each scope, as duplicated scope strings may lead to unintentional data exposure."})}),"\n",(0,i.jsx)(n.h2,{id:"user-authentication",children:"User authentication"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"StatusEndpoint"})," class includes methods for handling user sign-outs, whether from a single device or all devices."]}),"\n",(0,i.jsxs)(n.admonition,{type:"info",children:[(0,i.jsxs)(n.p,{children:["In addition to the ",(0,i.jsx)(n.code,{children:"StatusEndpoint"})," methods, Serverpod provides more comprehensive tools for managing user authentication and sign-out processes across multiple devices."]}),(0,i.jsxs)(n.p,{children:["For more detailed information on managing and revoking authentication keys, please refer to the ",(0,i.jsx)(n.a,{href:"providers/custom-providers#revoking-authentication-keys",children:"Revoking authentication keys"})," section."]})]}),"\n",(0,i.jsx)(n.h4,{id:"sign-out-device",children:"Sign out device"}),"\n",(0,i.jsx)(n.p,{children:"To sign out a single device:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"await client.modules.auth.status.signOutDevice();\n"})}),"\n",(0,i.jsx)(n.p,{children:"This status endpoint method obtains the authentication key from session's authentication information, then revokes that key."}),"\n",(0,i.jsx)(n.h4,{id:"sign-out-all-devices",children:"Sign out all devices"}),"\n",(0,i.jsx)(n.p,{children:"To sign the user out across all devices:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"await client.modules.auth.status.signOutAllDevices();\n"})}),"\n",(0,i.jsx)(n.p,{children:"This status endpoint retrieves the user ID from session's authentication information, then revokes all authentication keys related to that user."}),"\n",(0,i.jsxs)(n.admonition,{type:"info",children:[(0,i.jsx)(n.mdxAdmonitionTitle,{}),(0,i.jsx)("span",{id:"deprecated-signout-endpoint"}),(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"signOut"})," status endpoint is deprecated. Use ",(0,i.jsx)(n.code,{children:"signOutDevice"})," or ",(0,i.jsx)(n.code,{children:"signOutAllDevices"})," instead."]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"await client.modules.auth.status.signOut(); // Deprecated\n"})}),(0,i.jsxs)(n.p,{children:["The behavior of ",(0,i.jsx)(n.code,{children:"signOut"})," is controlled by ",(0,i.jsx)(n.code,{children:"legacyUserSignOutBehavior"}),", which you can adjust in the ",(0,i.jsx)(n.a,{href:"setup#configure-authentication",children:"configure authentication"})," section. This allows you to control the signout behaviour of already shipped clients."]})]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>a});var t=s(96540);const i={},o=t.createContext(i);function r(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkserverpod_docs=self.webpackChunkserverpod_docs||[]).push([[58800],{17059:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"concepts/authentication/basics","title":"The basics","description":"Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the serverpod_auth module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood.","source":"@site/docs/06-concepts/11-authentication/02-basics.md","sourceDirName":"06-concepts/11-authentication","slug":"/concepts/authentication/basics","permalink":"/next/concepts/authentication/basics","draft":false,"unlisted":false,"editUrl":"https://github.com/serverpod/serverpod_docs/tree/main/docs/06-concepts/11-authentication/02-basics.md","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Setup","permalink":"/next/concepts/authentication/setup"},"next":{"title":"Working with users","permalink":"/next/concepts/authentication/working-with-users"}}');var i=s(74848),o=s(28453);const r={},a="The basics",c={},d=[{value:"Requiring authentication on endpoints",id:"requiring-authentication-on-endpoints",level:2},{value:"Authorization on endpoints",id:"authorization-on-endpoints",level:2},{value:"Managing scopes",id:"managing-scopes",level:3},{value:"Custom scopes",id:"custom-scopes",level:3},{value:"User authentication",id:"user-authentication",level:2},{value:"Sign out device",id:"sign-out-device",level:4},{value:"Sign out all devices",id:"sign-out-all-devices",level:4}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",mdxAdmonitionTitle:"mdxAdmonitionTitle",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"the-basics",children:"The basics"})}),"\n",(0,i.jsxs)(n.p,{children:["Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the ",(0,i.jsx)(n.code,{children:"serverpod_auth"})," module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood."]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"Session"})," object provides information about the current user. A unique ",(0,i.jsx)(n.code,{children:"userId"})," identifies a user. You should use this id whenever you a referring to a user. Access the id of a signed-in user through the ",(0,i.jsx)(n.code,{children:"authenticated"})," asynchronous getter of the ",(0,i.jsx)(n.code,{children:"Session"})," object."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"Future myMethod(Session session) async {\n final authenticationInfo = await session.authenticated;\n final userId = authenticationInfo?.userId;\n ...\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"You can also use the Session object to check if a user is authenticated:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"Future myMethod(Session session) async {\n var isSignedIn = await session.isUserSignedIn;\n ...\n}\n"})}),"\n",(0,i.jsx)(n.h2,{id:"requiring-authentication-on-endpoints",children:"Requiring authentication on endpoints"}),"\n",(0,i.jsxs)(n.p,{children:["It is common to want to restrict access to an endpoint to users that have signed in. You can do this by overriding the ",(0,i.jsx)(n.code,{children:"requireLogin"})," property of the ",(0,i.jsx)(n.code,{children:"Endpoint"})," class."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,i.jsx)(n.h2,{id:"authorization-on-endpoints",children:"Authorization on endpoints"}),"\n",(0,i.jsxs)(n.p,{children:["Serverpod also supports scopes for restricting access. One or more scopes can be associated with a user. For instance, this can be used to give admin access to a specific user. To restrict access for an endpoint, override the ",(0,i.jsx)(n.code,{children:"requiredScopes"})," property. Note that setting ",(0,i.jsx)(n.code,{children:"requiredScopes"})," implicitly sets ",(0,i.jsx)(n.code,{children:"requireLogin"})," to true."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n @override\n Set get requiredScopes => {Scope.admin};\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,i.jsx)(n.h3,{id:"managing-scopes",children:"Managing scopes"}),"\n",(0,i.jsxs)(n.p,{children:["New users are created without any scopes. To update a user's scopes, use the ",(0,i.jsx)(n.code,{children:"Users"})," class's ",(0,i.jsx)(n.code,{children:"updateUserScopes"})," method (requires the ",(0,i.jsx)(n.code,{children:"serverpod_auth_server"})," package). This method replaces all previously stored scopes."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"await Users.updateUserScopes(session, userId, {Scope.admin});\n"})}),"\n",(0,i.jsx)(n.h3,{id:"custom-scopes",children:"Custom scopes"}),"\n",(0,i.jsx)(n.p,{children:"You may need more granular access control for specific endpoints. To create custom scopes, extend the Scope class, as shown below:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"class CustomScope extends Scope {\n const CustomScope(String name) : super(name);\n\n static const userRead = CustomScope('userRead');\n static const userWrite = CustomScope('userWrite');\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"Then use the custom scopes like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n @override\n Set get requiredScopes => {CustomScope.userRead, CustomScope.userWrite};\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"caution",children:(0,i.jsx)(n.p,{children:"Keep in mind that a scope is merely an arbitrary string and can be written in any format you prefer. However, it's crucial to use unique strings for each scope, as duplicated scope strings may lead to unintentional data exposure."})}),"\n",(0,i.jsx)(n.h2,{id:"user-authentication",children:"User authentication"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"StatusEndpoint"})," class includes methods for handling user sign-outs, whether from a single device or all devices."]}),"\n",(0,i.jsxs)(n.admonition,{type:"info",children:[(0,i.jsxs)(n.p,{children:["In addition to the ",(0,i.jsx)(n.code,{children:"StatusEndpoint"})," methods, Serverpod provides more comprehensive tools for managing user authentication and sign-out processes across multiple devices."]}),(0,i.jsxs)(n.p,{children:["For more detailed information on managing and revoking authentication keys, please refer to the ",(0,i.jsx)(n.a,{href:"providers/custom-providers#revoking-authentication-keys",children:"Revoking authentication keys"})," section."]})]}),"\n",(0,i.jsx)(n.h4,{id:"sign-out-device",children:"Sign out device"}),"\n",(0,i.jsx)(n.p,{children:"To sign out a single device:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"await client.modules.auth.status.signOutDevice();\n"})}),"\n",(0,i.jsx)(n.p,{children:"This status endpoint method obtains the authentication key from session's authentication information, then revokes that key."}),"\n",(0,i.jsx)(n.h4,{id:"sign-out-all-devices",children:"Sign out all devices"}),"\n",(0,i.jsx)(n.p,{children:"To sign the user out across all devices:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"await client.modules.auth.status.signOutAllDevices();\n"})}),"\n",(0,i.jsx)(n.p,{children:"This status endpoint retrieves the user ID from session's authentication information, then revokes all authentication keys related to that user."}),"\n",(0,i.jsxs)(n.admonition,{type:"info",children:[(0,i.jsx)(n.mdxAdmonitionTitle,{}),(0,i.jsx)("span",{id:"deprecated-signout-endpoint"}),(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"signOut"})," status endpoint is deprecated. Use ",(0,i.jsx)(n.code,{children:"signOutDevice"})," or ",(0,i.jsx)(n.code,{children:"signOutAllDevices"})," instead."]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"await client.modules.auth.status.signOut(); // Deprecated\n"})}),(0,i.jsxs)(n.p,{children:["The behavior of ",(0,i.jsx)(n.code,{children:"signOut"})," is controlled by ",(0,i.jsx)(n.code,{children:"legacyUserSignOutBehavior"}),", which you can adjust in the ",(0,i.jsx)(n.a,{href:"setup#configure-authentication",children:"configure authentication"})," section. This allows you to control the signout behaviour of already shipped clients."]})]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>a});var t=s(96540);const i={},o=t.createContext(i);function r(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/docs/assets/js/747fb5d3.b9fa52c9.js b/docs/assets/js/747fb5d3.f1fe028b.js
similarity index 53%
rename from docs/assets/js/747fb5d3.b9fa52c9.js
rename to docs/assets/js/747fb5d3.f1fe028b.js
index 2646855124..88ab7ef440 100644
--- a/docs/assets/js/747fb5d3.b9fa52c9.js
+++ b/docs/assets/js/747fb5d3.f1fe028b.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkserverpod_docs=self.webpackChunkserverpod_docs||[]).push([[94493],{34092:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"concepts/authentication/basics","title":"The basics","description":"Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the serverpod_auth module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood.","source":"@site/versioned_docs/version-2.3.0/06-concepts/11-authentication/02-basics.md","sourceDirName":"06-concepts/11-authentication","slug":"/concepts/authentication/basics","permalink":"/concepts/authentication/basics","draft":false,"unlisted":false,"editUrl":"https://github.com/serverpod/serverpod_docs/tree/main/versioned_docs/version-2.3.0/06-concepts/11-authentication/02-basics.md","tags":[],"version":"2.3.0","sidebarPosition":2,"frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Setup","permalink":"/concepts/authentication/setup"},"next":{"title":"Working with users","permalink":"/concepts/authentication/working-with-users"}}');var t=s(74848),o=s(28453);const r={},a="The basics",c={},d=[{value:"Requiring authentication on endpoints",id:"requiring-authentication-on-endpoints",level:2},{value:"Authorization on endpoints",id:"authorization-on-endpoints",level:2},{value:"Managing scopes",id:"managing-scopes",level:3},{value:"Custom scopes",id:"custom-scopes",level:3},{value:"User authentication",id:"user-authentication",level:2},{value:"Sign out device",id:"sign-out-device",level:4},{value:"Sign out all devices",id:"sign-out-all-devices",level:4}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",mdxAdmonitionTitle:"mdxAdmonitionTitle",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"the-basics",children:"The basics"})}),"\n",(0,t.jsxs)(n.p,{children:["Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the ",(0,t.jsx)(n.code,{children:"serverpod_auth"})," module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"Session"})," object provides information about the current user. A unique ",(0,t.jsx)(n.code,{children:"userId"})," identifies a user. You should use this id whenever you a referring to a user. Access the id of a signed-in user through the ",(0,t.jsx)(n.code,{children:"authenticated"})," field of the ",(0,t.jsx)(n.code,{children:"Session"})," object."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"Future myMethod(Session session) async {\n var userId = (await session.authenticated)?.userId;\n ...\n}\n"})}),"\n",(0,t.jsx)(n.p,{children:"You can also use the Session object to check if a user is authenticated:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"Future myMethod(Session session) async {\n var isSignedIn = await session.isUserSignedIn;\n ...\n}\n"})}),"\n",(0,t.jsx)(n.h2,{id:"requiring-authentication-on-endpoints",children:"Requiring authentication on endpoints"}),"\n",(0,t.jsxs)(n.p,{children:["It is common to want to restrict access to an endpoint to users that have signed in. You can do this by overriding the ",(0,t.jsx)(n.code,{children:"requireLogin"})," property of the ",(0,t.jsx)(n.code,{children:"Endpoint"})," class."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,t.jsx)(n.h2,{id:"authorization-on-endpoints",children:"Authorization on endpoints"}),"\n",(0,t.jsxs)(n.p,{children:["Serverpod also supports scopes for restricting access. One or more scopes can be associated with a user. For instance, this can be used to give admin access to a specific user. To restrict access for an endpoint, override the ",(0,t.jsx)(n.code,{children:"requiredScopes"})," property. Note that setting ",(0,t.jsx)(n.code,{children:"requiredScopes"})," implicitly sets ",(0,t.jsx)(n.code,{children:"requireLogin"})," to true."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n @override\n Set get requiredScopes => {Scope.admin};\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,t.jsx)(n.h3,{id:"managing-scopes",children:"Managing scopes"}),"\n",(0,t.jsxs)(n.p,{children:["New users are created without any scopes. To update a user's scopes, use the ",(0,t.jsx)(n.code,{children:"Users"})," class's ",(0,t.jsx)(n.code,{children:"updateUserScopes"})," method (requires the ",(0,t.jsx)(n.code,{children:"serverpod_auth_server"})," package). This method replaces all previously stored scopes."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"await Users.updateUserScopes(session, userId, {Scope.admin});\n"})}),"\n",(0,t.jsx)(n.h3,{id:"custom-scopes",children:"Custom scopes"}),"\n",(0,t.jsx)(n.p,{children:"You may need more granular access control for specific endpoints. To create custom scopes, extend the Scope class, as shown below:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"class CustomScope extends Scope {\n const CustomScope(String name) : super(name);\n\n static const userRead = CustomScope('userRead');\n static const userWrite = CustomScope('userWrite');\n}\n"})}),"\n",(0,t.jsx)(n.p,{children:"Then use the custom scopes like this:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n @override\n Set get requiredScopes => {CustomScope.userRead, CustomScope.userWrite};\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"caution",children:(0,t.jsx)(n.p,{children:"Keep in mind that a scope is merely an arbitrary string and can be written in any format you prefer. However, it's crucial to use unique strings for each scope, as duplicated scope strings may lead to unintentional data exposure."})}),"\n",(0,t.jsx)(n.h2,{id:"user-authentication",children:"User authentication"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"StatusEndpoint"})," class includes methods for handling user sign-outs, whether from a single device or all devices."]}),"\n",(0,t.jsxs)(n.admonition,{type:"info",children:[(0,t.jsxs)(n.p,{children:["In addition to the ",(0,t.jsx)(n.code,{children:"StatusEndpoint"})," methods, Serverpod provides more comprehensive tools for managing user authentication and sign-out processes across multiple devices."]}),(0,t.jsxs)(n.p,{children:["For more detailed information on managing and revoking authentication keys, please refer to the ",(0,t.jsx)(n.a,{href:"providers/custom-providers#revoking-authentication-keys",children:"Revoking authentication keys"})," section."]})]}),"\n",(0,t.jsx)(n.h4,{id:"sign-out-device",children:"Sign out device"}),"\n",(0,t.jsx)(n.p,{children:"To sign out a single device:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"await client.modules.auth.status.signOutDevice();\n"})}),"\n",(0,t.jsx)(n.p,{children:"This status endpoint method obtains the authentication key from session's authentication information, then revokes that key."}),"\n",(0,t.jsx)(n.h4,{id:"sign-out-all-devices",children:"Sign out all devices"}),"\n",(0,t.jsx)(n.p,{children:"To sign the user out across all devices:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"await client.modules.auth.status.signOutAllDevices();\n"})}),"\n",(0,t.jsx)(n.p,{children:"This status endpoint retrieves the user ID from session's authentication information, then revokes all authentication keys related to that user."}),"\n",(0,t.jsxs)(n.admonition,{type:"info",children:[(0,t.jsx)(n.mdxAdmonitionTitle,{}),(0,t.jsx)("span",{id:"deprecated-signout-endpoint"}),(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"signOut"})," status endpoint is deprecated. Use ",(0,t.jsx)(n.code,{children:"signOutDevice"})," or ",(0,t.jsx)(n.code,{children:"signOutAllDevices"})," instead."]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"await client.modules.auth.status.signOut(); // Deprecated\n"})}),(0,t.jsxs)(n.p,{children:["The behavior of ",(0,t.jsx)(n.code,{children:"signOut"})," is controlled by ",(0,t.jsx)(n.code,{children:"legacyUserSignOutBehavior"}),", which you can adjust in the ",(0,t.jsx)(n.a,{href:"setup#configure-authentication",children:"configure authentication"})," section. This allows you to control the signout behaviour of already shipped clients."]})]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>a});var i=s(96540);const t={},o=i.createContext(t);function r(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkserverpod_docs=self.webpackChunkserverpod_docs||[]).push([[94493],{34092:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"concepts/authentication/basics","title":"The basics","description":"Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the serverpod_auth module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood.","source":"@site/versioned_docs/version-2.3.0/06-concepts/11-authentication/02-basics.md","sourceDirName":"06-concepts/11-authentication","slug":"/concepts/authentication/basics","permalink":"/concepts/authentication/basics","draft":false,"unlisted":false,"editUrl":"https://github.com/serverpod/serverpod_docs/tree/main/versioned_docs/version-2.3.0/06-concepts/11-authentication/02-basics.md","tags":[],"version":"2.3.0","sidebarPosition":2,"frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Setup","permalink":"/concepts/authentication/setup"},"next":{"title":"Working with users","permalink":"/concepts/authentication/working-with-users"}}');var i=s(74848),o=s(28453);const r={},a="The basics",c={},d=[{value:"Requiring authentication on endpoints",id:"requiring-authentication-on-endpoints",level:2},{value:"Authorization on endpoints",id:"authorization-on-endpoints",level:2},{value:"Managing scopes",id:"managing-scopes",level:3},{value:"Custom scopes",id:"custom-scopes",level:3},{value:"User authentication",id:"user-authentication",level:2},{value:"Sign out device",id:"sign-out-device",level:4},{value:"Sign out all devices",id:"sign-out-all-devices",level:4}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",mdxAdmonitionTitle:"mdxAdmonitionTitle",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"the-basics",children:"The basics"})}),"\n",(0,i.jsxs)(n.p,{children:["Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the ",(0,i.jsx)(n.code,{children:"serverpod_auth"})," module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood."]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"Session"})," object provides information about the current user. A unique ",(0,i.jsx)(n.code,{children:"userId"})," identifies a user. You should use this id whenever you a referring to a user. Access the id of a signed-in user through the ",(0,i.jsx)(n.code,{children:"authenticated"})," asynchronous getter of the ",(0,i.jsx)(n.code,{children:"Session"})," object."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"Future myMethod(Session session) async {\n final authenticationInfo = await session.authenticated;\n final userId = authenticationInfo?.userId;\n ...\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"You can also use the Session object to check if a user is authenticated:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"Future myMethod(Session session) async {\n var isSignedIn = await session.isUserSignedIn;\n ...\n}\n"})}),"\n",(0,i.jsx)(n.h2,{id:"requiring-authentication-on-endpoints",children:"Requiring authentication on endpoints"}),"\n",(0,i.jsxs)(n.p,{children:["It is common to want to restrict access to an endpoint to users that have signed in. You can do this by overriding the ",(0,i.jsx)(n.code,{children:"requireLogin"})," property of the ",(0,i.jsx)(n.code,{children:"Endpoint"})," class."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,i.jsx)(n.h2,{id:"authorization-on-endpoints",children:"Authorization on endpoints"}),"\n",(0,i.jsxs)(n.p,{children:["Serverpod also supports scopes for restricting access. One or more scopes can be associated with a user. For instance, this can be used to give admin access to a specific user. To restrict access for an endpoint, override the ",(0,i.jsx)(n.code,{children:"requiredScopes"})," property. Note that setting ",(0,i.jsx)(n.code,{children:"requiredScopes"})," implicitly sets ",(0,i.jsx)(n.code,{children:"requireLogin"})," to true."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n @override\n Set get requiredScopes => {Scope.admin};\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,i.jsx)(n.h3,{id:"managing-scopes",children:"Managing scopes"}),"\n",(0,i.jsxs)(n.p,{children:["New users are created without any scopes. To update a user's scopes, use the ",(0,i.jsx)(n.code,{children:"Users"})," class's ",(0,i.jsx)(n.code,{children:"updateUserScopes"})," method (requires the ",(0,i.jsx)(n.code,{children:"serverpod_auth_server"})," package). This method replaces all previously stored scopes."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"await Users.updateUserScopes(session, userId, {Scope.admin});\n"})}),"\n",(0,i.jsx)(n.h3,{id:"custom-scopes",children:"Custom scopes"}),"\n",(0,i.jsx)(n.p,{children:"You may need more granular access control for specific endpoints. To create custom scopes, extend the Scope class, as shown below:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"class CustomScope extends Scope {\n const CustomScope(String name) : super(name);\n\n static const userRead = CustomScope('userRead');\n static const userWrite = CustomScope('userWrite');\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"Then use the custom scopes like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n @override\n Set get requiredScopes => {CustomScope.userRead, CustomScope.userWrite};\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"caution",children:(0,i.jsx)(n.p,{children:"Keep in mind that a scope is merely an arbitrary string and can be written in any format you prefer. However, it's crucial to use unique strings for each scope, as duplicated scope strings may lead to unintentional data exposure."})}),"\n",(0,i.jsx)(n.h2,{id:"user-authentication",children:"User authentication"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"StatusEndpoint"})," class includes methods for handling user sign-outs, whether from a single device or all devices."]}),"\n",(0,i.jsxs)(n.admonition,{type:"info",children:[(0,i.jsxs)(n.p,{children:["In addition to the ",(0,i.jsx)(n.code,{children:"StatusEndpoint"})," methods, Serverpod provides more comprehensive tools for managing user authentication and sign-out processes across multiple devices."]}),(0,i.jsxs)(n.p,{children:["For more detailed information on managing and revoking authentication keys, please refer to the ",(0,i.jsx)(n.a,{href:"providers/custom-providers#revoking-authentication-keys",children:"Revoking authentication keys"})," section."]})]}),"\n",(0,i.jsx)(n.h4,{id:"sign-out-device",children:"Sign out device"}),"\n",(0,i.jsx)(n.p,{children:"To sign out a single device:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"await client.modules.auth.status.signOutDevice();\n"})}),"\n",(0,i.jsx)(n.p,{children:"This status endpoint method obtains the authentication key from session's authentication information, then revokes that key."}),"\n",(0,i.jsx)(n.h4,{id:"sign-out-all-devices",children:"Sign out all devices"}),"\n",(0,i.jsx)(n.p,{children:"To sign the user out across all devices:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"await client.modules.auth.status.signOutAllDevices();\n"})}),"\n",(0,i.jsx)(n.p,{children:"This status endpoint retrieves the user ID from session's authentication information, then revokes all authentication keys related to that user."}),"\n",(0,i.jsxs)(n.admonition,{type:"info",children:[(0,i.jsx)(n.mdxAdmonitionTitle,{}),(0,i.jsx)("span",{id:"deprecated-signout-endpoint"}),(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"signOut"})," status endpoint is deprecated. Use ",(0,i.jsx)(n.code,{children:"signOutDevice"})," or ",(0,i.jsx)(n.code,{children:"signOutAllDevices"})," instead."]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-dart",children:"await client.modules.auth.status.signOut(); // Deprecated\n"})}),(0,i.jsxs)(n.p,{children:["The behavior of ",(0,i.jsx)(n.code,{children:"signOut"})," is controlled by ",(0,i.jsx)(n.code,{children:"legacyUserSignOutBehavior"}),", which you can adjust in the ",(0,i.jsx)(n.a,{href:"setup#configure-authentication",children:"configure authentication"})," section. This allows you to control the signout behaviour of already shipped clients."]})]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>a});var t=s(96540);const i={},o=t.createContext(i);function r(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/docs/assets/js/runtime~main.42b5377a.js b/docs/assets/js/runtime~main.6fc25181.js
similarity index 99%
rename from docs/assets/js/runtime~main.42b5377a.js
rename to docs/assets/js/runtime~main.6fc25181.js
index 7a6f6bc994..c4f1165194 100644
--- a/docs/assets/js/runtime~main.42b5377a.js
+++ b/docs/assets/js/runtime~main.6fc25181.js
@@ -1 +1 @@
-(()=>{"use strict";var e,a,d,f,c,b={},r={};function t(e){var a=r[e];if(void 0!==a)return a.exports;var d=r[e]={exports:{}};return b[e].call(d.exports,d,d.exports,t),d.exports}t.m=b,e=[],t.O=(a,d,f,c)=>{if(!d){var b=1/0;for(n=0;n=c)&&Object.keys(t.O).every((e=>t.O[e](d[o])))?d.splice(o--,1):(r=!1,c0&&e[n-1][2]>c;n--)e[n]=e[n-1];e[n]=[d,f,c]},t.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return t.d(a,{a:a}),a},d=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,t.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var c=Object.create(null);t.r(c);var b={};a=a||[null,d({}),d([]),d(d)];for(var r=2&f&&e;"object"==typeof r&&!~a.indexOf(r);r=d(r))Object.getOwnPropertyNames(r).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,t.d(c,b),c},t.d=(e,a)=>{for(var d in a)t.o(a,d)&&!t.o(e,d)&&Object.defineProperty(e,d,{enumerable:!0,get:a[d]})},t.f={},t.e=e=>Promise.all(Object.keys(t.f).reduce(((a,d)=>(t.f[d](e,a),a)),[])),t.u=e=>"assets/js/"+({456:"cb867d98",565:"3f04b2f3",589:"3f4d54c7",762:"cdc118a8",1006:"f8dd123c",1160:"638e38ae",1171:"b685e31b",1441:"af9b8c85",1572:"02c0cfe0",1705:"1921e4ca",1832:"bdc5a52e",1871:"2796447e",1923:"b32c213b",1970:"dbf9e27d",2278:"27e827f8",2295:"0a5c01b2",2316:"a1610459",2496:"3874f1bf",2730:"ac6e050c",3202:"8e7261c9",3230:"9d217e1f",3249:"05ec9480",3392:"reactPlayerVidyard",3607:"d8d6d57b",3705:"52398098",3783:"a6c3ea4a",3877:"79840965",3900:"ecb3c634",4272:"17dc776d",4276:"7a3d47b3",4499:"f149b10e",4550:"e3443ce0",4645:"9644aa4e",5e3:"da698f4c",5268:"beab84d5",5344:"8baf194b",5352:"52f87500",5441:"af1c5d2b",5547:"ebd4b56d",5623:"10ad1fa6",5819:"e4a796aa",5827:"3d277f18",5885:"3e4a4cb2",6129:"c56bdfca",6157:"cce58fe7",6215:"f3467f26",6231:"61285fa7",6236:"a8c1f82d",6262:"27b43779",6265:"46b54090",6308:"2890c80c",6463:"reactPlayerKaltura",6486:"2e1ee4ed",6497:"5112ebe3",6615:"7b06977d",6918:"89b55a09",7161:"19e323d1",7267:"2db5c390",7606:"7517a61c",7656:"91633089",7681:"7da54b54",7701:"c2b45dbb",7785:"95bf5f56",7848:"2581590c",7956:"51dd138a",8271:"94b2bc9a",8349:"06a408fe",8500:"4c5c4c2e",8734:"82e43b76",8927:"b8787c81",9215:"02e914fe",9264:"1caa8cdb",9524:"daec0d60",9606:"4519f039",9640:"5589c54d",9647:"5e95c892",9671:"e64edb60",9837:"5a0a1617",10348:"fca5fdb4",10443:"0931faae",10700:"313c9eb1",10845:"5c1eff22",10907:"f7ae65ac",11139:"dc7352a7",11184:"8af032d3",11301:"f584139f",11567:"22dd74f7",11607:"ef2492df",11721:"10e267de",11784:"45dd886d",11934:"b809d820",11965:"1457ddcd",12007:"90ec8c6b",12042:"reactPlayerTwitch",12219:"3e3aae1a",12237:"b6f81eaa",12716:"d2aa311d",12744:"9de020c4",12766:"4934de22",12827:"28967b3e",12902:"f02fca7f",13018:"076cf272",13019:"d3938b1f",13455:"5839343c",13535:"e84b4e80",13585:"ea237062",13650:"2d11a680",14080:"f4322d5c",14237:"95a5d2b2",14432:"f5e72c0a",14578:"8612c3ac",14936:"7c8e5227",15066:"fe3f3783",15246:"83c6f999",15422:"fc471c47",15447:"30bd0f5b",15536:"baba055e",15955:"fe7002a3",16029:"e839f599",16328:"reactPlayerDailyMotion",16602:"616631fd",16678:"710ac1c1",16869:"444a6d4e",16884:"4ed1e0ac",16945:"5596dd05",17021:"828ace52",17209:"f9bde383",17289:"45939ed5",17320:"55f37562",17776:"070c8c93",17820:"ebd05845",18025:"4b539d9d",18093:"0841186f",18401:"17896441",18446:"reactPlayerYouTube",18776:"c36ed66b",19049:"2fca5c64",19738:"87ab7385",20033:"986f0f98",20210:"68401255",20423:"22f51758",20515:"704545ab",20681:"e66f2658",20773:"d4fc3158",20826:"4ab30eec",21611:"82444e58",21983:"57012fa6",22309:"3020aab5",22422:"d3af5b3c",22447:"ceb48fe7",22451:"f5a589e7",22611:"59df87e8",22701:"fb6429ba",22750:"141135bb",23321:"676f1bdb",23452:"5af30237",23453:"ed64c12e",23619:"f6affd6e",23870:"956829f8",23983:"44dc7864",24078:"ec91ff36",24158:"1d39c85d",24295:"96523456",24636:"d158719f",24796:"8423508e",24832:"02e41de2",25362:"5bc657fa",25427:"3edac44d",25504:"0f2c2e36",25666:"522ca66b",25691:"9a594c98",25692:"7ca2e59a",26173:"reactPlayerVimeo",26376:"431ffdb5",26411:"93ae665a",26499:"a4adf53f",26622:"d9107a6a",26766:"fe33edfa",27168:"7ac69e68",27350:"65e04ea3",27547:"5cc14181",27646:"12407b36",27685:"6aee17c2",27740:"38e32826",27800:"2a36564f",28235:"965931d7",29248:"4a49065b",29250:"dec2bd4a",29285:"7607a467",29436:"dc8c27bd",29773:"1a84c7fd",30067:"373bc822",30248:"b1218054",30418:"6feb7661",30473:"3141060a",30528:"1323771c",30765:"85d514f3",30773:"38e9742f",30799:"1a39ee04",30941:"4aa94ec1",31080:"626d8d5f",31165:"926056c1",31267:"08d55cf7",31471:"3f80bb14",31474:"564db590",31727:"2e18ba50",32055:"9037180b",32096:"c090764b",32111:"f8fee680",32141:"df1414bb",32163:"3d150a24",32178:"16116660",32406:"5cde491b",32461:"a6311318",32492:"4e689a0b",32504:"7de3e81f",32741:"d9e7b984",32744:"fde0b76a",32759:"7800d508",32789:"f9de1e68",32944:"272aa200",33048:"25c6d77a",33098:"71ba2dc1",33460:"9107c65f",33577:"a32c313f",33588:"10933a93",33701:"4e5965c3",33992:"cbf3c4ec",34321:"6f56eca8",34438:"54cab4d4",34662:"cf3c245e",34726:"1b6591f7",34750:"07e708e9",34935:"6da448d1",34975:"ff5ed6ba",35223:"db7d4591",35540:"ce86e3e6",35563:"e7977816",35654:"dc4059b2",35742:"aba21aa0",35748:"1312139a",35884:"9c9052d1",36058:"a2a1c245",36100:"e7dfb2de",36132:"e8f4756d",36353:"reactPlayerPreview",36572:"3aa84b2d",36731:"bd568e77",36886:"8abbb0ee",36920:"ed772d97",37107:"3817c387",37296:"a2757506",37516:"9f1829f0",37655:"6decf956",37710:"abd13aa2",37758:"0e764995",37850:"b28bd8b1",37990:"441fd5fc",38031:"8ee9837e",38419:"bd6f2233",38471:"caf7731d",38527:"5e7d099e",38610:"c868bccf",38691:"036b5431",38717:"897331c0",38792:"4f0519c7",38853:"fc67ad3d",38864:"fac0eceb",39026:"c7156cf2",39056:"5f6b1733",39080:"511f9951",39228:"27cc7342",39294:"438ea691",39408:"fe2e2e26",39431:"cdd4a9c6",39482:"327b0a57",39558:"50f2f9f3",39757:"9e0c2c37",39823:"5ed5f7a9",39911:"92466816",40271:"6a734661",40374:"b5dcbe95",40563:"39dec3ba",40575:"33c1d41a",41237:"88a48c42",41507:"16b03284",41865:"fe76eed8",42083:"4048090e",42206:"91aed80e",42434:"5b2d7e3c",42800:"3aa0ab0a",42901:"2115313f",43174:"6ba85e75",43246:"2d16d24d",43444:"d2f6d210",43773:"a81cb65f",43834:"3bff9c7c",43848:"44145933",43888:"ad61550a",43903:"8186ecf9",43949:"9aaed8b4",44046:"5d707891",44103:"75829dda",44141:"cb43ed9b",44164:"a24f0440",44189:"f5602aa3",44486:"c0650537",44602:"69fcd2fc",44609:"c5313007",44630:"65b7208a",44769:"4a7af9ca",44816:"36fcb744",44947:"39ec0930",45072:"7c299f6a",45141:"b1394c86",45268:"ef4456b5",45295:"f29fc884",45474:"79d28454",45655:"4a55fe3a",45679:"50d72525",45724:"8dfd8953",45742:"c377a04b",46119:"d58f1ee2",46268:"26ad82e9",46364:"fe522f67",46429:"6e1b24e9",46563:"aeef55f7",46643:"53d20392",46688:"ac3101e9",46921:"d0b9ca74",46961:"2bbc2deb",47108:"075f0e80",47120:"dcbfe205",47127:"999788b8",47256:"7b09383e",47264:"b9ec56c8",47322:"a7f9f0ff",47341:"7f0714d1",47452:"a7b0b2b7",47472:"71f9ed0c",47527:"93dcedec",47627:"reactPlayerStreamable",47719:"b7ea99f7",47758:"1b9544a9",48099:"12a78962",48124:"8f509517",48134:"356ce494",48235:"df15bc7d",48276:"b467d32a",48436:"f6adf820",48552:"954e932f",48579:"566f49fb",48665:"0f4a5c74",49316:"510b9307",49406:"b26210db",49455:"c8139b75",49625:"ff61db29",49658:"0d76317c",49921:"fc8b5a5d",50041:"ac002d2b",50404:"98f4e1ec",50734:"eb44eb85",50765:"bf519c8d",50908:"3fbaac07",51143:"fc6f07d2",51205:"db42f242",51349:"4aec9039",51379:"17f04a83",51637:"81e4ed6a",51780:"eecc43ff",51782:"09ca145d",51865:"a768738b",52302:"e7ee6027",52365:"280af06a",52529:"e3d58533",52723:"reactPlayerMux",52961:"8bf57c9f",53084:"23975af2",53148:"9b4ab8cd",53357:"1577f7ed",53774:"53998120",54049:"4867e743",54220:"092bf57d",54530:"a271ef09",54582:"984d6493",54705:"33af2f09",54905:"98d962c5",55011:"49145cdf",55324:"c94e1931",55388:"b2419a00",55664:"169f3d24",56264:"46eeb6cb",56282:"d636c09f",56417:"538bb064",56420:"fd4b36bb",56449:"6bb5bff7",56532:"4205d879",56660:"f30d2866",56684:"378935ce",56764:"805a59dc",57035:"f527bef3",57356:"bb9c591b",57694:"21b7a589",57790:"1b218eaa",57869:"a7edc2bd",58022:"c134ef8a",58718:"afb7a97b",58800:"5144cf5e",59032:"8ffcd916",59075:"6e29a506",59221:"76259cc3",59327:"03db70c9",59409:"a64b2578",59599:"1e1f8072",59949:"5c6f6ba9",60071:"9eb2dfca",60365:"bd118f84",60759:"719163ad",60880:"640696ee",60886:"c10a0985",60893:"6fbf0c67",60908:"0eebd274",61114:"3cc71396",61252:"3b66921f",61273:"099a3596",61291:"d38e3f9f",61358:"3d1ae229",61368:"f28f059c",61505:"e58556b2",61730:"b2b2619a",61977:"7570de64",62059:"0893faed",62134:"0d7acd84",62357:"6d2a4d3f",62362:"44463284",62573:"bd1cffff",62814:"7a9b3614",62921:"1d7c691c",62929:"f5fed352",63474:"98c94590",63538:"06393fc1",63706:"2b67eda4",63737:"53e9dd7a",63747:"fb72d7b2",63960:"a6397568",64019:"6fb78fba",64284:"13ee52e7",64558:"b91fbf2a",64641:"eac16e1d",64651:"4c781063",64665:"6f44ab90",65110:"063d75bd",65142:"eb4c176e",65312:"729daf19",65352:"ed3aad8c",65433:"616bfcf6",65542:"af754a1f",65571:"a1df5076",65655:"1ebbfca8",65755:"bafd283f",65784:"90239e6e",65847:"e49a3b4b",65866:"419cd6b8",66225:"9f8e6d57",66339:"03b2528f",66811:"3e87058f",66850:"0c695afe",66868:"3c4af576",66885:"5e253f2f",66912:"51907bd1",66929:"da54b976",67016:"dc576323",67059:"9e6051e1",67068:"ae0eacdd",67098:"a7bd4aaa",67217:"726a6c22",67349:"61ff6850",67458:"0d271e1e",67532:"49fed513",67570:"reactPlayerMixcloud",67706:"e7f4b98d",67714:"9d7352c0",68230:"3cf6fa35",68251:"eaa4efd8",68364:"812775a4",68391:"24557dbc",68700:"96331245",68874:"10ea0b82",68912:"2c2832e4",68915:"62de5d73",68960:"358c2507",68962:"af68ae04",69050:"4ac2e930",69779:"3c9432f0",69816:"20d56cb7",69891:"62037464",69979:"reactPlayerSoundCloud",70115:"52994a20",70326:"c3373259",70669:"b018547e",70843:"a518290b",70934:"d44e0d1c",71247:"308471de",71341:"f7ebdce2",71383:"087cd58c",71826:"a4c89d62",71907:"86a8bb6c",71967:"4fa4eafa",72074:"71319bec",72132:"83ac10ed",72188:"44b88e48",72231:"fe170cc9",72422:"521e3baf",72561:"adce8179",73107:"646cbece",73379:"9d779d8b",73480:"b2aeaed7",73932:"2020ed93",73939:"2ed96714",74081:"ce4dbf6d",74431:"f18da6aa",74520:"9addcfc7",74583:"4bfca71d",74780:"ebde045d",74834:"d26a73b8",74860:"00d14154",74961:"5c7e11fb",75412:"5390e21f",75702:"307525ba",75822:"2db99065",75868:"071f33a8",75965:"b48f41b9",76093:"7d63aba8",76224:"03b3cfd2",76238:"8615e055",76350:"9b933485",76372:"d802bb56",76768:"8bed5a26",76973:"78ae7ec8",77137:"42abcd4d",77313:"ee65edec",77318:"67e77328",77567:"4dc6f423",77757:"f6f476f1",78007:"8eead450",78416:"068743c8",78630:"959ac691",78631:"b7b014bf",78702:"82ea7079",79028:"6b48b7b8",79048:"a94703ab",79052:"6d717251",79225:"526e379a",79354:"4118187a",79526:"75a33358",79628:"a24a5808",79825:"2d4af3bf",79956:"9e09f891",79983:"a7f483d1",80124:"97efa4fc",80190:"be6201fa",80549:"afde3230",80721:"05fa9a60",81291:"a979af25",81445:"74d42203",81509:"4ead9a95",81657:"f8189ec4",81790:"42a9b3c5",81805:"20ff9753",81849:"2e3fc0f9",82075:"056b386b",82099:"52813856",82201:"18910d94",82261:"0c6fe626",82439:"e4eafb12",82477:"2ca08277",83072:"6b5df954",83287:"7af31c45",83294:"6f549117",83720:"d5aabfc9",83752:"efe5610c",83943:"9c5d9512",84092:"19e2305b",84219:"51e50f95",84492:"ba51d442",84605:"8552f549",84656:"813cfb2f",84750:"aefdd881",84850:"bc03f89b",85026:"83fd2af9",85155:"f640cf83",85462:"9270ba4f",85527:"5143312c",85528:"21e10cde",85556:"21a4ba71",85943:"05fbef88",86012:"da202fdd",86037:"eaeab60b",86057:"9fbfaf6d",86106:"1877d9d5",86298:"e2d6ba1f",86546:"8a63049b",86886:"7b33c27b",86887:"reactPlayerFacebook",86992:"3fe65583",87012:"869ae8a7",87126:"b916a1ab",87402:"c3094240",87501:"2674f827",87510:"9d36f238",87760:"0773e78b",88048:"73ca4188",88131:"c2237e68",88494:"504d78e0",88495:"801276a1",88790:"51c7df8c",88843:"45926b62",88946:"95ec96e5",89598:"4b6eee9a",90049:"cc180519",90642:"07006f9e",90780:"098f2604",90899:"609f97b9",90986:"6028a11d",91131:"468d57a9",91194:"cf401e04",91258:"227d1fc4",91395:"a0aa5253",92113:"32b8fafb",92170:"4951b372",92205:"bacd9a7c",92687:"cd64d641",92811:"8093477b",92896:"bc69c5bc",93036:"c342bcae",93087:"b0f19176",93203:"a43ad670",93503:"17e2e969",93833:"9b833276",93842:"26398b18",94205:"39fe1b84",94493:"747fb5d3",94594:"c7507218",94642:"da19ecb4",94725:"dd31e7e9",94811:"da071cb8",95191:"c75d145e",95223:"4f4aa41c",95409:"94f11012",95909:"896258c1",96414:"794a8057",96449:"19a6be06",96815:"8d02075b",96991:"4eee9c87",97034:"0ddd0e66",97191:"31b73615",97289:"233249da",97458:"reactPlayerFilePlayer",97499:"50a12feb",97785:"ac5db01d",97847:"d9df7455",98042:"819b642a",98116:"49849746",98175:"5a96e453",98484:"22302c03",98498:"ae22b856",98548:"44a83f6a",98601:"13798859",98996:"65c67349",99094:"08aab21d",99340:"reactPlayerWistia",99341:"a1154d73",99591:"e0bec135",99644:"1ba60223",99989:"51ddac88"}[e]||e)+"."+{456:"3bf529f7",565:"bed1c850",589:"0befdfa9",762:"d2174ca0",1006:"31f96bab",1160:"bdb31d58",1171:"43543aa9",1441:"fd7b300b",1572:"0cfa3362",1705:"2528c13d",1832:"68bd5dfc",1871:"575e687f",1923:"f4dc4250",1970:"cc3f99ad",2278:"52a102f5",2295:"5302c2da",2316:"6dfad0b4",2496:"48da3b37",2730:"a304021f",3202:"503450b2",3230:"e99996b9",3249:"cad0d93e",3392:"8464e17b",3607:"41af52b1",3705:"08936b46",3783:"04c7a56f",3877:"bbb12f8a",3900:"4eee5db3",4272:"5327c9b2",4276:"0ff680f6",4499:"8a0343dd",4550:"800c1410",4645:"a270f8fb",5e3:"65b6fa57",5268:"c5f6e420",5344:"4fb59513",5352:"5c276b6d",5441:"a0d10636",5547:"f81de728",5623:"b20ed08c",5819:"12ce2193",5827:"3e25f443",5885:"24306e07",6129:"049e2657",6157:"eff98bd1",6215:"31ae42b7",6231:"e9adaca6",6236:"13db7b1d",6262:"e675b845",6265:"12404f60",6308:"5f3e0e5b",6463:"bec1a06c",6486:"22f47090",6497:"fadb7e82",6615:"e0733f11",6918:"cef59c19",7161:"09ca0649",7267:"2eb42cd5",7606:"b220f86c",7656:"a4a92bc4",7681:"a424d259",7701:"49318b54",7785:"2a8785a9",7848:"8ea818c7",7956:"2e3fbdcc",8271:"cbe74f6b",8349:"5f85a47c",8500:"d7bf511f",8734:"29b499c2",8927:"6f999770",9215:"5574cece",9264:"7fdd1f29",9524:"e29aaf6f",9606:"1957caed",9640:"6a5d88d6",9647:"cac24016",9671:"e8d1d6ac",9837:"2990961f",10348:"78f9f4e8",10443:"29567304",10700:"ce11f188",10845:"6add59b6",10907:"cf9dba7a",11139:"7e17d20e",11184:"b3a25d5a",11301:"15f51fd1",11567:"37a3cdad",11607:"a1c095dc",11721:"ddee74d7",11784:"3d5cf7c1",11934:"1770953b",11965:"d777c784",12007:"0a983281",12042:"a0c42814",12219:"401c0d07",12237:"a9b0cc23",12716:"5099e1c9",12744:"616414a6",12766:"cb4da8e3",12827:"6118b61c",12902:"444cec4c",13018:"3383df8d",13019:"600402c2",13455:"7278ce8a",13535:"8c2fe49b",13585:"00bae75a",13650:"d1b07f39",14080:"6a723b72",14237:"9cb32cf1",14432:"b2c74608",14578:"9cd22e2b",14936:"082570fa",15066:"95c7a677",15246:"740dce57",15422:"f8904b6d",15447:"04e69fb0",15536:"0591c7e4",15955:"6cdb02af",16029:"a1ecc271",16328:"4fa8d3c8",16602:"031b46ad",16678:"6f234e7f",16869:"81a2a888",16884:"07f5d6a4",16945:"46037186",17021:"481eaf6f",17209:"ad9bd8b6",17289:"48e0340f",17320:"baac871f",17776:"c0410a93",17820:"ecdb30e3",18025:"ec1649c0",18093:"88a93afb",18401:"30c4f83a",18446:"150ff8a0",18776:"01b81203",19049:"cc505400",19738:"5bbb4e27",20033:"4d9de467",20210:"4987d48c",20423:"9464251e",20515:"ed6cf262",20681:"895a60b0",20773:"7b374ff9",20826:"4abb5e3c",21611:"2812dc09",21983:"dbbb4174",22309:"248029f7",22422:"7b57c7c1",22447:"67663617",22451:"0d9f4fa7",22611:"66463762",22701:"8b651e24",22750:"a8cb4c36",23321:"2095330e",23452:"52cb7538",23453:"2cb5d6e7",23619:"d3f9ca62",23870:"0c70301a",23983:"34ff443e",24078:"40b61f09",24158:"9e048aeb",24295:"b02c6044",24636:"63cf56d9",24796:"6cf0f3ca",24832:"7934d2f9",25362:"969e76f4",25427:"f4fc9661",25504:"c5325f85",25666:"49b116a0",25691:"b202a53f",25692:"22af4f62",26173:"076fef9c",26376:"82580212",26411:"02cefa64",26499:"ed5ef33e",26622:"33a2684a",26766:"939d4598",27168:"ea09aa96",27350:"b622f983",27547:"02ef84ba",27646:"ab0d6065",27685:"2e22137f",27740:"085fef8a",27800:"5b900962",28235:"1004749b",29248:"098f61c2",29250:"748fbf44",29285:"c6a44719",29436:"4d0944b8",29773:"3ce3a554",30067:"89867601",30248:"63c91dea",30418:"5eff8ee1",30473:"3550d0ba",30528:"d0410269",30765:"2cb51d03",30773:"a71ee3b7",30799:"17eeaa9c",30941:"c3f340a8",31080:"f9af4c7d",31165:"2403bfef",31267:"4162a3e6",31471:"9b6dda95",31474:"d994a20f",31727:"1543b3aa",32055:"a70c3cf6",32096:"49650e68",32111:"a59aa3ce",32141:"94108e98",32163:"c9c0455c",32178:"f452c1e3",32406:"388ba990",32461:"df6ca91d",32492:"0022b426",32504:"a3895f2a",32741:"f7508f8d",32744:"eddf052b",32759:"c7341e25",32789:"eef1db39",32944:"3ad81361",33048:"180175a3",33098:"b42f86fd",33460:"1321c8ed",33577:"a15d143b",33588:"cd17ca2f",33701:"25bfd469",33992:"b6f5c86d",34321:"3fca4d77",34438:"60e905e1",34662:"fb2368a3",34726:"72d38370",34750:"1e7df9e7",34935:"2d5f4656",34975:"e4112614",35223:"d00b6e10",35540:"87aff258",35563:"ea252326",35654:"07e62338",35742:"e08a145a",35748:"7b09cedb",35884:"22aa93e5",36058:"6a13b234",36100:"0502fbc3",36132:"937c33f0",36353:"4de9bab6",36572:"edfed652",36731:"658424dc",36886:"8aaaa526",36920:"2ffe0535",37107:"457955a3",37296:"c4fdf168",37516:"ae64149c",37655:"a4336309",37710:"f06b9e79",37758:"4da11cb1",37850:"6e674056",37990:"d75149ed",38031:"f0396c00",38419:"c1191973",38471:"fe6a6334",38527:"15bc909b",38610:"8b43a310",38691:"16fea600",38717:"2a439f75",38792:"89e64fc5",38853:"a5515f03",38864:"72f6fb46",39026:"5334a226",39056:"ee74fe7d",39080:"b0585cee",39228:"441ef16c",39294:"9634b173",39408:"422c6350",39431:"529c6ee9",39482:"4451e89f",39503:"18fac5cf",39558:"74c339d9",39757:"e8a4973d",39823:"653ca755",39911:"46e0568e",40271:"5e6bd9c0",40374:"7ed0227f",40563:"2a5279fd",40575:"149c4540",41237:"78ef8b62",41507:"83abc862",41865:"01c485ca",42083:"a1723a5f",42206:"18d5693f",42434:"532ca6ec",42800:"fa5732a8",42901:"da14ef8e",43174:"1ae5b0b4",43246:"c0703b79",43444:"7d8b1654",43773:"1b7ff4ab",43834:"4f342163",43848:"92cfe76c",43888:"aa8fd92a",43903:"e4c94057",43949:"29ab9758",44046:"8058817e",44103:"0c150d88",44141:"fb31070e",44164:"0218091d",44189:"c688c3ac",44486:"0d44e3b2",44602:"0f818018",44609:"461b4926",44630:"e873d45b",44769:"ad7087e8",44816:"76259a84",44947:"793e3f30",45072:"17eb9a78",45141:"0422a0ee",45268:"cfd0889c",45295:"4248d016",45474:"49030196",45655:"6beda4fc",45679:"c8514dc5",45724:"3d7416ea",45742:"f2db22e3",46119:"5d911f90",46268:"cebacb03",46364:"7fab948c",46429:"0275aaf8",46563:"798407c3",46643:"5cd43758",46688:"9745b4ab",46921:"97629923",46961:"8a1f635a",47108:"06b66793",47120:"78fb2058",47127:"76fbb443",47256:"57880651",47264:"4aed6d18",47322:"f0ea7d7b",47341:"0492598d",47452:"5e9a2459",47472:"063e336f",47527:"0e612b80",47627:"bb35fa43",47719:"16d15d6b",47758:"e8864681",48099:"9dc1013b",48124:"a99c83c4",48134:"8bdfbff2",48235:"8037e889",48276:"0ac13bb2",48436:"61a45365",48552:"4a8f654e",48579:"78921083",48665:"0ada6aae",49316:"5363916a",49406:"424eb54b",49455:"648c4ce5",49625:"80c70c34",49658:"c4861fb8",49921:"fc6d4e12",50041:"7ed6da9f",50404:"8fb196bc",50734:"c4703693",50765:"616b4b7f",50908:"0ee266e6",51143:"1b201809",51205:"010f2df3",51349:"e99f8c5a",51379:"493dd3c5",51637:"ff7c1499",51780:"b133e3d9",51782:"2d007aca",51865:"3a6d59b9",52302:"c6b53e5d",52365:"b26e6537",52529:"9c10b4e2",52723:"3e4df075",52961:"a184b649",53084:"bdba8810",53148:"011ea0b4",53357:"b36dd3e8",53774:"e1ef7d5d",54049:"eee29418",54220:"8448c1c4",54530:"23a82c91",54582:"a5d7603c",54705:"3f738e4b",54905:"bc44bc6d",55011:"a6788f4d",55324:"148ff9a6",55388:"4fe45eee",55664:"17b9e76d",56264:"6318e439",56282:"3e130e49",56417:"0cd41893",56420:"7334a2e9",56449:"62146a1b",56532:"0263ed6f",56660:"b925dfa2",56684:"f0421b7a",56764:"8b28de2e",57035:"e5ba70d9",57356:"ab90e540",57694:"817841bd",57790:"794c39eb",57869:"7d3d53bd",58022:"760b5b6c",58718:"afd35ec4",58800:"2fa57623",59032:"5f666fa6",59075:"71f01f4d",59221:"7947d799",59327:"2ee22f03",59409:"2cccb1fe",59599:"dcf9c22e",59949:"b6f2d6a3",60071:"e18d75db",60365:"c53174c4",60759:"979081a2",60880:"4a5af84f",60886:"2988e127",60893:"262267dc",60908:"631ff7e3",61114:"dfddc8b1",61252:"d531b1a5",61273:"a36f2fd4",61291:"6cda27f6",61358:"1867a69b",61368:"aeef1db6",61505:"1a21d780",61730:"6ea4f6a4",61977:"32a24abf",62059:"34998d9d",62134:"9ffaf69c",62357:"7888230a",62362:"6e67f6cf",62573:"432f0db1",62814:"e4db8fbd",62921:"aeda3551",62929:"90a8e262",63474:"bdf60564",63538:"49330bae",63706:"79076a44",63737:"8dc4c8aa",63747:"4a61d19d",63960:"ec034579",64019:"28758d03",64284:"2bd77eda",64558:"4d1cac39",64641:"913ae86b",64651:"0f464cda",64665:"76eda960",65110:"a963d653",65142:"b24dbfa5",65312:"8f50addd",65352:"24ab1a2a",65433:"a26cc163",65542:"e83efb34",65571:"542635f9",65655:"486883bf",65755:"7fde95d5",65784:"c9e4936e",65847:"1c50deb4",65866:"70fe52c2",66225:"1845c31b",66339:"bd5d4432",66811:"0da3ceb7",66850:"a8558aef",66868:"c54fe4d0",66885:"3909e763",66912:"acc66a5a",66929:"d218d95f",67016:"f8e07181",67059:"ed96df7a",67068:"36e6731b",67098:"03929b29",67217:"f0457378",67349:"4808f8ab",67458:"5bae4e2e",67532:"0f008a1a",67570:"12aff88e",67706:"b0edda93",67714:"7fbd772f",68230:"8cdcec50",68251:"27190b16",68364:"3826ed74",68391:"15261a3f",68700:"878eb230",68874:"e157169d",68912:"868278bd",68915:"0ed0c714",68960:"5c27a458",68962:"70b6a4d6",69050:"24536720",69779:"f46c10f0",69816:"cd56545f",69891:"3eb6da45",69979:"f8f19bc3",70115:"6fdf9a7d",70326:"23742192",70669:"1c903b6c",70843:"18511ed0",70934:"aacde903",71247:"444da1bc",71341:"704bb2ba",71383:"9560230b",71826:"91727c5e",71907:"6087ac78",71967:"515cc3c8",72074:"9823718c",72132:"61d0fb6e",72188:"c6457b90",72231:"a16562c3",72422:"13084b4a",72561:"b8c15734",73107:"c8f5d06c",73379:"f8579888",73480:"53c5dffd",73932:"7e71812f",73939:"1bcf9a4e",74081:"f369eae2",74431:"05faa640",74520:"26e37902",74583:"8fcc3b93",74780:"9ef3091a",74834:"6e4020d0",74860:"8b2e9676",74961:"18868c0e",75412:"851da555",75702:"af81e46c",75822:"af84bb3c",75868:"73753a39",75965:"87f800a3",76093:"5e402a98",76224:"4a337291",76238:"37095157",76350:"cdc406f8",76372:"427b7110",76768:"ec9c773c",76973:"36cad622",77137:"aedda13e",77313:"7c49672d",77318:"079c2535",77567:"f077f609",77757:"55c5f717",78007:"bffb3aa0",78416:"92157af7",78630:"52cb145d",78631:"32793266",78702:"e42a8268",79028:"1c5e1b17",79048:"0f54d2a9",79052:"2597209b",79225:"2b405a5e",79354:"c4b8e5cf",79526:"8c4d4ea3",79628:"aba47b7f",79825:"487d4fe6",79956:"b44a93bb",79983:"8fb557e5",80124:"cf03d623",80190:"2151b287",80549:"927ce320",80721:"724f52f5",81291:"34d69721",81445:"8e63aeb1",81509:"ffa79dd6",81657:"e9c4c968",81790:"70944d29",81805:"06277f56",81849:"7c7a86cc",82075:"05c5cb73",82099:"ceeaa266",82201:"abce6fa4",82237:"787c04ec",82261:"56d05024",82439:"6e17edce",82477:"c1a9fb74",83072:"4a3c32da",83287:"3bd3171e",83294:"99d774e2",83720:"f1655082",83752:"0e738f7e",83943:"a64bf43a",84092:"8037d74d",84219:"c9a52c69",84492:"aac2578e",84605:"dda220f4",84656:"ee4b1f89",84750:"3cb9395a",84850:"30a1320a",85026:"b146d7bd",85155:"f5746601",85462:"8305afa0",85527:"cd83bdd9",85528:"74b87448",85556:"8952cc16",85943:"47cbb047",86012:"713ed951",86037:"3e3ca792",86057:"390bd7e1",86106:"28a6ab59",86298:"2b90b295",86546:"5dd8e541",86886:"25742600",86887:"508da014",86992:"813995a0",87012:"9b3d3cfe",87126:"70ffb610",87402:"211c0534",87501:"ed510fe4",87510:"3ce53dbf",87760:"d2b2d2c3",88048:"fcbe8eff",88131:"b632d02c",88494:"f9f8f001",88495:"452f0be1",88790:"84a2be5e",88843:"152ff9f1",88946:"d896746f",89598:"9564b3ff",90049:"631f2ec4",90642:"b825e084",90780:"3a2bb595",90899:"dce9458d",90986:"7bcc0576",91131:"d5558d28",91194:"407298e3",91258:"15aee314",91395:"16f406a0",92113:"4ea6c011",92170:"83684ee4",92205:"7094ab16",92687:"bb260a5c",92811:"a99fae46",92896:"bdb85543",93036:"51251aca",93087:"64286f41",93203:"09ea14b1",93503:"89a06a4a",93833:"bad49015",93842:"99bd467c",94205:"c4d761cb",94493:"b9fa52c9",94594:"705d29b8",94642:"88355706",94725:"6d9c4ec3",94811:"37da4193",95191:"dc4962af",95223:"7d26a2a6",95409:"8393e70e",95909:"d9e176aa",96414:"68c49e52",96449:"bd671d71",96815:"28aa9d74",96991:"c38bcb59",97034:"8a120790",97191:"8f5992aa",97289:"b468ced8",97458:"036de6e1",97499:"c9fc3141",97785:"62f0f347",97847:"a4d3ea63",98042:"a7352085",98116:"bdc39478",98175:"b82b2d9f",98484:"480e97fc",98498:"90e26889",98548:"290650fe",98601:"9ad80dce",98996:"8b6044d3",99094:"bb03c5f6",99340:"c5c0cf6c",99341:"f242f189",99591:"823e72a3",99644:"134ec1cf",99989:"4039096e"}[e]+".js",t.miniCssF=e=>{},t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),t.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},c="serverpod-docs:",t.l=(e,a,d,b)=>{if(f[e])f[e].push(a);else{var r,o;if(void 0!==d)for(var l=document.getElementsByTagName("script"),n=0;n{r.onerror=r.onload=null,clearTimeout(s);var c=f[e];if(delete f[e],r.parentNode&&r.parentNode.removeChild(r),c&&c.forEach((e=>e(d))),a)return a(d)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=u.bind(null,r.onerror),r.onload=u.bind(null,r.onload),o&&document.head.appendChild(r)}},t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.p="/",t.gca=function(e){return e={13798859:"98601",16116660:"32178",17896441:"18401",44145933:"43848",44463284:"62362",49849746:"98116",52398098:"3705",52813856:"82099",53998120:"53774",62037464:"69891",68401255:"20210",79840965:"3877",91633089:"7656",92466816:"39911",96331245:"68700",96523456:"24295",cb867d98:"456","3f04b2f3":"565","3f4d54c7":"589",cdc118a8:"762",f8dd123c:"1006","638e38ae":"1160",b685e31b:"1171",af9b8c85:"1441","02c0cfe0":"1572","1921e4ca":"1705",bdc5a52e:"1832","2796447e":"1871",b32c213b:"1923",dbf9e27d:"1970","27e827f8":"2278","0a5c01b2":"2295",a1610459:"2316","3874f1bf":"2496",ac6e050c:"2730","8e7261c9":"3202","9d217e1f":"3230","05ec9480":"3249",reactPlayerVidyard:"3392",d8d6d57b:"3607",a6c3ea4a:"3783",ecb3c634:"3900","17dc776d":"4272","7a3d47b3":"4276",f149b10e:"4499",e3443ce0:"4550","9644aa4e":"4645",da698f4c:"5000",beab84d5:"5268","8baf194b":"5344","52f87500":"5352",af1c5d2b:"5441",ebd4b56d:"5547","10ad1fa6":"5623",e4a796aa:"5819","3d277f18":"5827","3e4a4cb2":"5885",c56bdfca:"6129",cce58fe7:"6157",f3467f26:"6215","61285fa7":"6231",a8c1f82d:"6236","27b43779":"6262","46b54090":"6265","2890c80c":"6308",reactPlayerKaltura:"6463","2e1ee4ed":"6486","5112ebe3":"6497","7b06977d":"6615","89b55a09":"6918","19e323d1":"7161","2db5c390":"7267","7517a61c":"7606","7da54b54":"7681",c2b45dbb:"7701","95bf5f56":"7785","2581590c":"7848","51dd138a":"7956","94b2bc9a":"8271","06a408fe":"8349","4c5c4c2e":"8500","82e43b76":"8734",b8787c81:"8927","02e914fe":"9215","1caa8cdb":"9264",daec0d60:"9524","4519f039":"9606","5589c54d":"9640","5e95c892":"9647",e64edb60:"9671","5a0a1617":"9837",fca5fdb4:"10348","0931faae":"10443","313c9eb1":"10700","5c1eff22":"10845",f7ae65ac:"10907",dc7352a7:"11139","8af032d3":"11184",f584139f:"11301","22dd74f7":"11567",ef2492df:"11607","10e267de":"11721","45dd886d":"11784",b809d820:"11934","1457ddcd":"11965","90ec8c6b":"12007",reactPlayerTwitch:"12042","3e3aae1a":"12219",b6f81eaa:"12237",d2aa311d:"12716","9de020c4":"12744","4934de22":"12766","28967b3e":"12827",f02fca7f:"12902","076cf272":"13018",d3938b1f:"13019","5839343c":"13455",e84b4e80:"13535",ea237062:"13585","2d11a680":"13650",f4322d5c:"14080","95a5d2b2":"14237",f5e72c0a:"14432","8612c3ac":"14578","7c8e5227":"14936",fe3f3783:"15066","83c6f999":"15246",fc471c47:"15422","30bd0f5b":"15447",baba055e:"15536",fe7002a3:"15955",e839f599:"16029",reactPlayerDailyMotion:"16328","616631fd":"16602","710ac1c1":"16678","444a6d4e":"16869","4ed1e0ac":"16884","5596dd05":"16945","828ace52":"17021",f9bde383:"17209","45939ed5":"17289","55f37562":"17320","070c8c93":"17776",ebd05845:"17820","4b539d9d":"18025","0841186f":"18093",reactPlayerYouTube:"18446",c36ed66b:"18776","2fca5c64":"19049","87ab7385":"19738","986f0f98":"20033","22f51758":"20423","704545ab":"20515",e66f2658:"20681",d4fc3158:"20773","4ab30eec":"20826","82444e58":"21611","57012fa6":"21983","3020aab5":"22309",d3af5b3c:"22422",ceb48fe7:"22447",f5a589e7:"22451","59df87e8":"22611",fb6429ba:"22701","141135bb":"22750","676f1bdb":"23321","5af30237":"23452",ed64c12e:"23453",f6affd6e:"23619","956829f8":"23870","44dc7864":"23983",ec91ff36:"24078","1d39c85d":"24158",d158719f:"24636","8423508e":"24796","02e41de2":"24832","5bc657fa":"25362","3edac44d":"25427","0f2c2e36":"25504","522ca66b":"25666","9a594c98":"25691","7ca2e59a":"25692",reactPlayerVimeo:"26173","431ffdb5":"26376","93ae665a":"26411",a4adf53f:"26499",d9107a6a:"26622",fe33edfa:"26766","7ac69e68":"27168","65e04ea3":"27350","5cc14181":"27547","12407b36":"27646","6aee17c2":"27685","38e32826":"27740","2a36564f":"27800","965931d7":"28235","4a49065b":"29248",dec2bd4a:"29250","7607a467":"29285",dc8c27bd:"29436","1a84c7fd":"29773","373bc822":"30067",b1218054:"30248","6feb7661":"30418","3141060a":"30473","1323771c":"30528","85d514f3":"30765","38e9742f":"30773","1a39ee04":"30799","4aa94ec1":"30941","626d8d5f":"31080","926056c1":"31165","08d55cf7":"31267","3f80bb14":"31471","564db590":"31474","2e18ba50":"31727","9037180b":"32055",c090764b:"32096",f8fee680:"32111",df1414bb:"32141","3d150a24":"32163","5cde491b":"32406",a6311318:"32461","4e689a0b":"32492","7de3e81f":"32504",d9e7b984:"32741",fde0b76a:"32744","7800d508":"32759",f9de1e68:"32789","272aa200":"32944","25c6d77a":"33048","71ba2dc1":"33098","9107c65f":"33460",a32c313f:"33577","10933a93":"33588","4e5965c3":"33701",cbf3c4ec:"33992","6f56eca8":"34321","54cab4d4":"34438",cf3c245e:"34662","1b6591f7":"34726","07e708e9":"34750","6da448d1":"34935",ff5ed6ba:"34975",db7d4591:"35223",ce86e3e6:"35540",e7977816:"35563",dc4059b2:"35654",aba21aa0:"35742","1312139a":"35748","9c9052d1":"35884",a2a1c245:"36058",e7dfb2de:"36100",e8f4756d:"36132",reactPlayerPreview:"36353","3aa84b2d":"36572",bd568e77:"36731","8abbb0ee":"36886",ed772d97:"36920","3817c387":"37107",a2757506:"37296","9f1829f0":"37516","6decf956":"37655",abd13aa2:"37710","0e764995":"37758",b28bd8b1:"37850","441fd5fc":"37990","8ee9837e":"38031",bd6f2233:"38419",caf7731d:"38471","5e7d099e":"38527",c868bccf:"38610","036b5431":"38691","897331c0":"38717","4f0519c7":"38792",fc67ad3d:"38853",fac0eceb:"38864",c7156cf2:"39026","5f6b1733":"39056","511f9951":"39080","27cc7342":"39228","438ea691":"39294",fe2e2e26:"39408",cdd4a9c6:"39431","327b0a57":"39482","50f2f9f3":"39558","9e0c2c37":"39757","5ed5f7a9":"39823","6a734661":"40271",b5dcbe95:"40374","39dec3ba":"40563","33c1d41a":"40575","88a48c42":"41237","16b03284":"41507",fe76eed8:"41865","4048090e":"42083","91aed80e":"42206","5b2d7e3c":"42434","3aa0ab0a":"42800","2115313f":"42901","6ba85e75":"43174","2d16d24d":"43246",d2f6d210:"43444",a81cb65f:"43773","3bff9c7c":"43834",ad61550a:"43888","8186ecf9":"43903","9aaed8b4":"43949","5d707891":"44046","75829dda":"44103",cb43ed9b:"44141",a24f0440:"44164",f5602aa3:"44189",c0650537:"44486","69fcd2fc":"44602",c5313007:"44609","65b7208a":"44630","4a7af9ca":"44769","36fcb744":"44816","39ec0930":"44947","7c299f6a":"45072",b1394c86:"45141",ef4456b5:"45268",f29fc884:"45295","79d28454":"45474","4a55fe3a":"45655","50d72525":"45679","8dfd8953":"45724",c377a04b:"45742",d58f1ee2:"46119","26ad82e9":"46268",fe522f67:"46364","6e1b24e9":"46429",aeef55f7:"46563","53d20392":"46643",ac3101e9:"46688",d0b9ca74:"46921","2bbc2deb":"46961","075f0e80":"47108",dcbfe205:"47120","999788b8":"47127","7b09383e":"47256",b9ec56c8:"47264",a7f9f0ff:"47322","7f0714d1":"47341",a7b0b2b7:"47452","71f9ed0c":"47472","93dcedec":"47527",reactPlayerStreamable:"47627",b7ea99f7:"47719","1b9544a9":"47758","12a78962":"48099","8f509517":"48124","356ce494":"48134",df15bc7d:"48235",b467d32a:"48276",f6adf820:"48436","954e932f":"48552","566f49fb":"48579","0f4a5c74":"48665","510b9307":"49316",b26210db:"49406",c8139b75:"49455",ff61db29:"49625","0d76317c":"49658",fc8b5a5d:"49921",ac002d2b:"50041","98f4e1ec":"50404",eb44eb85:"50734",bf519c8d:"50765","3fbaac07":"50908",fc6f07d2:"51143",db42f242:"51205","4aec9039":"51349","17f04a83":"51379","81e4ed6a":"51637",eecc43ff:"51780","09ca145d":"51782",a768738b:"51865",e7ee6027:"52302","280af06a":"52365",e3d58533:"52529",reactPlayerMux:"52723","8bf57c9f":"52961","23975af2":"53084","9b4ab8cd":"53148","1577f7ed":"53357","4867e743":"54049","092bf57d":"54220",a271ef09:"54530","984d6493":"54582","33af2f09":"54705","98d962c5":"54905","49145cdf":"55011",c94e1931:"55324",b2419a00:"55388","169f3d24":"55664","46eeb6cb":"56264",d636c09f:"56282","538bb064":"56417",fd4b36bb:"56420","6bb5bff7":"56449","4205d879":"56532",f30d2866:"56660","378935ce":"56684","805a59dc":"56764",f527bef3:"57035",bb9c591b:"57356","21b7a589":"57694","1b218eaa":"57790",a7edc2bd:"57869",c134ef8a:"58022",afb7a97b:"58718","5144cf5e":"58800","8ffcd916":"59032","6e29a506":"59075","76259cc3":"59221","03db70c9":"59327",a64b2578:"59409","1e1f8072":"59599","5c6f6ba9":"59949","9eb2dfca":"60071",bd118f84:"60365","719163ad":"60759","640696ee":"60880",c10a0985:"60886","6fbf0c67":"60893","0eebd274":"60908","3cc71396":"61114","3b66921f":"61252","099a3596":"61273",d38e3f9f:"61291","3d1ae229":"61358",f28f059c:"61368",e58556b2:"61505",b2b2619a:"61730","7570de64":"61977","0893faed":"62059","0d7acd84":"62134","6d2a4d3f":"62357",bd1cffff:"62573","7a9b3614":"62814","1d7c691c":"62921",f5fed352:"62929","98c94590":"63474","06393fc1":"63538","2b67eda4":"63706","53e9dd7a":"63737",fb72d7b2:"63747",a6397568:"63960","6fb78fba":"64019","13ee52e7":"64284",b91fbf2a:"64558",eac16e1d:"64641","4c781063":"64651","6f44ab90":"64665","063d75bd":"65110",eb4c176e:"65142","729daf19":"65312",ed3aad8c:"65352","616bfcf6":"65433",af754a1f:"65542",a1df5076:"65571","1ebbfca8":"65655",bafd283f:"65755","90239e6e":"65784",e49a3b4b:"65847","419cd6b8":"65866","9f8e6d57":"66225","03b2528f":"66339","3e87058f":"66811","0c695afe":"66850","3c4af576":"66868","5e253f2f":"66885","51907bd1":"66912",da54b976:"66929",dc576323:"67016","9e6051e1":"67059",ae0eacdd:"67068",a7bd4aaa:"67098","726a6c22":"67217","61ff6850":"67349","0d271e1e":"67458","49fed513":"67532",reactPlayerMixcloud:"67570",e7f4b98d:"67706","9d7352c0":"67714","3cf6fa35":"68230",eaa4efd8:"68251","812775a4":"68364","24557dbc":"68391","10ea0b82":"68874","2c2832e4":"68912","62de5d73":"68915","358c2507":"68960",af68ae04:"68962","4ac2e930":"69050","3c9432f0":"69779","20d56cb7":"69816",reactPlayerSoundCloud:"69979","52994a20":"70115",c3373259:"70326",b018547e:"70669",a518290b:"70843",d44e0d1c:"70934","308471de":"71247",f7ebdce2:"71341","087cd58c":"71383",a4c89d62:"71826","86a8bb6c":"71907","4fa4eafa":"71967","71319bec":"72074","83ac10ed":"72132","44b88e48":"72188",fe170cc9:"72231","521e3baf":"72422",adce8179:"72561","646cbece":"73107","9d779d8b":"73379",b2aeaed7:"73480","2020ed93":"73932","2ed96714":"73939",ce4dbf6d:"74081",f18da6aa:"74431","9addcfc7":"74520","4bfca71d":"74583",ebde045d:"74780",d26a73b8:"74834","00d14154":"74860","5c7e11fb":"74961","5390e21f":"75412","307525ba":"75702","2db99065":"75822","071f33a8":"75868",b48f41b9:"75965","7d63aba8":"76093","03b3cfd2":"76224","8615e055":"76238","9b933485":"76350",d802bb56:"76372","8bed5a26":"76768","78ae7ec8":"76973","42abcd4d":"77137",ee65edec:"77313","67e77328":"77318","4dc6f423":"77567",f6f476f1:"77757","8eead450":"78007","068743c8":"78416","959ac691":"78630",b7b014bf:"78631","82ea7079":"78702","6b48b7b8":"79028",a94703ab:"79048","6d717251":"79052","526e379a":"79225","4118187a":"79354","75a33358":"79526",a24a5808:"79628","2d4af3bf":"79825","9e09f891":"79956",a7f483d1:"79983","97efa4fc":"80124",be6201fa:"80190",afde3230:"80549","05fa9a60":"80721",a979af25:"81291","74d42203":"81445","4ead9a95":"81509",f8189ec4:"81657","42a9b3c5":"81790","20ff9753":"81805","2e3fc0f9":"81849","056b386b":"82075","18910d94":"82201","0c6fe626":"82261",e4eafb12:"82439","2ca08277":"82477","6b5df954":"83072","7af31c45":"83287","6f549117":"83294",d5aabfc9:"83720",efe5610c:"83752","9c5d9512":"83943","19e2305b":"84092","51e50f95":"84219",ba51d442:"84492","8552f549":"84605","813cfb2f":"84656",aefdd881:"84750",bc03f89b:"84850","83fd2af9":"85026",f640cf83:"85155","9270ba4f":"85462","5143312c":"85527","21e10cde":"85528","21a4ba71":"85556","05fbef88":"85943",da202fdd:"86012",eaeab60b:"86037","9fbfaf6d":"86057","1877d9d5":"86106",e2d6ba1f:"86298","8a63049b":"86546","7b33c27b":"86886",reactPlayerFacebook:"86887","3fe65583":"86992","869ae8a7":"87012",b916a1ab:"87126",c3094240:"87402","2674f827":"87501","9d36f238":"87510","0773e78b":"87760","73ca4188":"88048",c2237e68:"88131","504d78e0":"88494","801276a1":"88495","51c7df8c":"88790","45926b62":"88843","95ec96e5":"88946","4b6eee9a":"89598",cc180519:"90049","07006f9e":"90642","098f2604":"90780","609f97b9":"90899","6028a11d":"90986","468d57a9":"91131",cf401e04:"91194","227d1fc4":"91258",a0aa5253:"91395","32b8fafb":"92113","4951b372":"92170",bacd9a7c:"92205",cd64d641:"92687","8093477b":"92811",bc69c5bc:"92896",c342bcae:"93036",b0f19176:"93087",a43ad670:"93203","17e2e969":"93503","9b833276":"93833","26398b18":"93842","39fe1b84":"94205","747fb5d3":"94493",c7507218:"94594",da19ecb4:"94642",dd31e7e9:"94725",da071cb8:"94811",c75d145e:"95191","4f4aa41c":"95223","94f11012":"95409","896258c1":"95909","794a8057":"96414","19a6be06":"96449","8d02075b":"96815","4eee9c87":"96991","0ddd0e66":"97034","31b73615":"97191","233249da":"97289",reactPlayerFilePlayer:"97458","50a12feb":"97499",ac5db01d:"97785",d9df7455:"97847","819b642a":"98042","5a96e453":"98175","22302c03":"98484",ae22b856:"98498","44a83f6a":"98548","65c67349":"98996","08aab21d":"99094",reactPlayerWistia:"99340",a1154d73:"99341",e0bec135:"99591","1ba60223":"99644","51ddac88":"99989"}[e]||e,t.p+t.u(e)},(()=>{var e={45354:0,71869:0};t.f.j=(a,d)=>{var f=t.o(e,a)?e[a]:void 0;if(0!==f)if(f)d.push(f[2]);else if(/^(45354|71869)$/.test(a))e[a]=0;else{var c=new Promise(((d,c)=>f=e[a]=[d,c]));d.push(f[2]=c);var b=t.p+t.u(a),r=new Error;t.l(b,(d=>{if(t.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var c=d&&("load"===d.type?"missing":d.type),b=d&&d.target&&d.target.src;r.message="Loading chunk "+a+" failed.\n("+c+": "+b+")",r.name="ChunkLoadError",r.type=c,r.request=b,f[1](r)}}),"chunk-"+a,a)}},t.O.j=a=>0===e[a];var a=(a,d)=>{var f,c,b=d[0],r=d[1],o=d[2],l=0;if(b.some((a=>0!==e[a]))){for(f in r)t.o(r,f)&&(t.m[f]=r[f]);if(o)var n=o(t)}for(a&&a(d);l{"use strict";var e,a,d,f,c,b={},r={};function t(e){var a=r[e];if(void 0!==a)return a.exports;var d=r[e]={exports:{}};return b[e].call(d.exports,d,d.exports,t),d.exports}t.m=b,e=[],t.O=(a,d,f,c)=>{if(!d){var b=1/0;for(n=0;n=c)&&Object.keys(t.O).every((e=>t.O[e](d[o])))?d.splice(o--,1):(r=!1,c0&&e[n-1][2]>c;n--)e[n]=e[n-1];e[n]=[d,f,c]},t.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return t.d(a,{a:a}),a},d=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,t.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var c=Object.create(null);t.r(c);var b={};a=a||[null,d({}),d([]),d(d)];for(var r=2&f&&e;"object"==typeof r&&!~a.indexOf(r);r=d(r))Object.getOwnPropertyNames(r).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,t.d(c,b),c},t.d=(e,a)=>{for(var d in a)t.o(a,d)&&!t.o(e,d)&&Object.defineProperty(e,d,{enumerable:!0,get:a[d]})},t.f={},t.e=e=>Promise.all(Object.keys(t.f).reduce(((a,d)=>(t.f[d](e,a),a)),[])),t.u=e=>"assets/js/"+({456:"cb867d98",565:"3f04b2f3",589:"3f4d54c7",762:"cdc118a8",1006:"f8dd123c",1160:"638e38ae",1171:"b685e31b",1441:"af9b8c85",1572:"02c0cfe0",1705:"1921e4ca",1832:"bdc5a52e",1871:"2796447e",1923:"b32c213b",1970:"dbf9e27d",2278:"27e827f8",2295:"0a5c01b2",2316:"a1610459",2496:"3874f1bf",2730:"ac6e050c",3202:"8e7261c9",3230:"9d217e1f",3249:"05ec9480",3392:"reactPlayerVidyard",3607:"d8d6d57b",3705:"52398098",3783:"a6c3ea4a",3877:"79840965",3900:"ecb3c634",4272:"17dc776d",4276:"7a3d47b3",4499:"f149b10e",4550:"e3443ce0",4645:"9644aa4e",5e3:"da698f4c",5268:"beab84d5",5344:"8baf194b",5352:"52f87500",5441:"af1c5d2b",5547:"ebd4b56d",5623:"10ad1fa6",5819:"e4a796aa",5827:"3d277f18",5885:"3e4a4cb2",6129:"c56bdfca",6157:"cce58fe7",6215:"f3467f26",6231:"61285fa7",6236:"a8c1f82d",6262:"27b43779",6265:"46b54090",6308:"2890c80c",6463:"reactPlayerKaltura",6486:"2e1ee4ed",6497:"5112ebe3",6615:"7b06977d",6918:"89b55a09",7161:"19e323d1",7267:"2db5c390",7606:"7517a61c",7656:"91633089",7681:"7da54b54",7701:"c2b45dbb",7785:"95bf5f56",7848:"2581590c",7956:"51dd138a",8271:"94b2bc9a",8349:"06a408fe",8500:"4c5c4c2e",8734:"82e43b76",8927:"b8787c81",9215:"02e914fe",9264:"1caa8cdb",9524:"daec0d60",9606:"4519f039",9640:"5589c54d",9647:"5e95c892",9671:"e64edb60",9837:"5a0a1617",10348:"fca5fdb4",10443:"0931faae",10700:"313c9eb1",10845:"5c1eff22",10907:"f7ae65ac",11139:"dc7352a7",11184:"8af032d3",11301:"f584139f",11567:"22dd74f7",11607:"ef2492df",11721:"10e267de",11784:"45dd886d",11934:"b809d820",11965:"1457ddcd",12007:"90ec8c6b",12042:"reactPlayerTwitch",12219:"3e3aae1a",12237:"b6f81eaa",12716:"d2aa311d",12744:"9de020c4",12766:"4934de22",12827:"28967b3e",12902:"f02fca7f",13018:"076cf272",13019:"d3938b1f",13455:"5839343c",13535:"e84b4e80",13585:"ea237062",13650:"2d11a680",14080:"f4322d5c",14237:"95a5d2b2",14432:"f5e72c0a",14578:"8612c3ac",14936:"7c8e5227",15066:"fe3f3783",15246:"83c6f999",15422:"fc471c47",15447:"30bd0f5b",15536:"baba055e",15955:"fe7002a3",16029:"e839f599",16328:"reactPlayerDailyMotion",16602:"616631fd",16678:"710ac1c1",16869:"444a6d4e",16884:"4ed1e0ac",16945:"5596dd05",17021:"828ace52",17209:"f9bde383",17289:"45939ed5",17320:"55f37562",17776:"070c8c93",17820:"ebd05845",18025:"4b539d9d",18093:"0841186f",18401:"17896441",18446:"reactPlayerYouTube",18776:"c36ed66b",19049:"2fca5c64",19738:"87ab7385",20033:"986f0f98",20210:"68401255",20423:"22f51758",20515:"704545ab",20681:"e66f2658",20773:"d4fc3158",20826:"4ab30eec",21611:"82444e58",21983:"57012fa6",22309:"3020aab5",22422:"d3af5b3c",22447:"ceb48fe7",22451:"f5a589e7",22611:"59df87e8",22701:"fb6429ba",22750:"141135bb",23321:"676f1bdb",23452:"5af30237",23453:"ed64c12e",23619:"f6affd6e",23870:"956829f8",23983:"44dc7864",24078:"ec91ff36",24158:"1d39c85d",24295:"96523456",24636:"d158719f",24796:"8423508e",24832:"02e41de2",25362:"5bc657fa",25427:"3edac44d",25504:"0f2c2e36",25666:"522ca66b",25691:"9a594c98",25692:"7ca2e59a",26173:"reactPlayerVimeo",26376:"431ffdb5",26411:"93ae665a",26499:"a4adf53f",26622:"d9107a6a",26766:"fe33edfa",27168:"7ac69e68",27350:"65e04ea3",27547:"5cc14181",27646:"12407b36",27685:"6aee17c2",27740:"38e32826",27800:"2a36564f",28235:"965931d7",29248:"4a49065b",29250:"dec2bd4a",29285:"7607a467",29436:"dc8c27bd",29773:"1a84c7fd",30067:"373bc822",30248:"b1218054",30418:"6feb7661",30473:"3141060a",30528:"1323771c",30765:"85d514f3",30773:"38e9742f",30799:"1a39ee04",30941:"4aa94ec1",31080:"626d8d5f",31165:"926056c1",31267:"08d55cf7",31471:"3f80bb14",31474:"564db590",31727:"2e18ba50",32055:"9037180b",32096:"c090764b",32111:"f8fee680",32141:"df1414bb",32163:"3d150a24",32178:"16116660",32406:"5cde491b",32461:"a6311318",32492:"4e689a0b",32504:"7de3e81f",32741:"d9e7b984",32744:"fde0b76a",32759:"7800d508",32789:"f9de1e68",32944:"272aa200",33048:"25c6d77a",33098:"71ba2dc1",33460:"9107c65f",33577:"a32c313f",33588:"10933a93",33701:"4e5965c3",33992:"cbf3c4ec",34321:"6f56eca8",34438:"54cab4d4",34662:"cf3c245e",34726:"1b6591f7",34750:"07e708e9",34935:"6da448d1",34975:"ff5ed6ba",35223:"db7d4591",35540:"ce86e3e6",35563:"e7977816",35654:"dc4059b2",35742:"aba21aa0",35748:"1312139a",35884:"9c9052d1",36058:"a2a1c245",36100:"e7dfb2de",36132:"e8f4756d",36353:"reactPlayerPreview",36572:"3aa84b2d",36731:"bd568e77",36886:"8abbb0ee",36920:"ed772d97",37107:"3817c387",37296:"a2757506",37516:"9f1829f0",37655:"6decf956",37710:"abd13aa2",37758:"0e764995",37850:"b28bd8b1",37990:"441fd5fc",38031:"8ee9837e",38419:"bd6f2233",38471:"caf7731d",38527:"5e7d099e",38610:"c868bccf",38691:"036b5431",38717:"897331c0",38792:"4f0519c7",38853:"fc67ad3d",38864:"fac0eceb",39026:"c7156cf2",39056:"5f6b1733",39080:"511f9951",39228:"27cc7342",39294:"438ea691",39408:"fe2e2e26",39431:"cdd4a9c6",39482:"327b0a57",39558:"50f2f9f3",39757:"9e0c2c37",39823:"5ed5f7a9",39911:"92466816",40271:"6a734661",40374:"b5dcbe95",40563:"39dec3ba",40575:"33c1d41a",41237:"88a48c42",41507:"16b03284",41865:"fe76eed8",42083:"4048090e",42206:"91aed80e",42434:"5b2d7e3c",42800:"3aa0ab0a",42901:"2115313f",43174:"6ba85e75",43246:"2d16d24d",43444:"d2f6d210",43773:"a81cb65f",43834:"3bff9c7c",43848:"44145933",43888:"ad61550a",43903:"8186ecf9",43949:"9aaed8b4",44046:"5d707891",44103:"75829dda",44141:"cb43ed9b",44164:"a24f0440",44189:"f5602aa3",44486:"c0650537",44602:"69fcd2fc",44609:"c5313007",44630:"65b7208a",44769:"4a7af9ca",44816:"36fcb744",44947:"39ec0930",45072:"7c299f6a",45141:"b1394c86",45268:"ef4456b5",45295:"f29fc884",45474:"79d28454",45655:"4a55fe3a",45679:"50d72525",45724:"8dfd8953",45742:"c377a04b",46119:"d58f1ee2",46268:"26ad82e9",46364:"fe522f67",46429:"6e1b24e9",46563:"aeef55f7",46643:"53d20392",46688:"ac3101e9",46921:"d0b9ca74",46961:"2bbc2deb",47108:"075f0e80",47120:"dcbfe205",47127:"999788b8",47256:"7b09383e",47264:"b9ec56c8",47322:"a7f9f0ff",47341:"7f0714d1",47452:"a7b0b2b7",47472:"71f9ed0c",47527:"93dcedec",47627:"reactPlayerStreamable",47719:"b7ea99f7",47758:"1b9544a9",48099:"12a78962",48124:"8f509517",48134:"356ce494",48235:"df15bc7d",48276:"b467d32a",48436:"f6adf820",48552:"954e932f",48579:"566f49fb",48665:"0f4a5c74",49316:"510b9307",49406:"b26210db",49455:"c8139b75",49625:"ff61db29",49658:"0d76317c",49921:"fc8b5a5d",50041:"ac002d2b",50404:"98f4e1ec",50734:"eb44eb85",50765:"bf519c8d",50908:"3fbaac07",51143:"fc6f07d2",51205:"db42f242",51349:"4aec9039",51379:"17f04a83",51637:"81e4ed6a",51780:"eecc43ff",51782:"09ca145d",51865:"a768738b",52302:"e7ee6027",52365:"280af06a",52529:"e3d58533",52723:"reactPlayerMux",52961:"8bf57c9f",53084:"23975af2",53148:"9b4ab8cd",53357:"1577f7ed",53774:"53998120",54049:"4867e743",54220:"092bf57d",54530:"a271ef09",54582:"984d6493",54705:"33af2f09",54905:"98d962c5",55011:"49145cdf",55324:"c94e1931",55388:"b2419a00",55664:"169f3d24",56264:"46eeb6cb",56282:"d636c09f",56417:"538bb064",56420:"fd4b36bb",56449:"6bb5bff7",56532:"4205d879",56660:"f30d2866",56684:"378935ce",56764:"805a59dc",57035:"f527bef3",57356:"bb9c591b",57694:"21b7a589",57790:"1b218eaa",57869:"a7edc2bd",58022:"c134ef8a",58718:"afb7a97b",58800:"5144cf5e",59032:"8ffcd916",59075:"6e29a506",59221:"76259cc3",59327:"03db70c9",59409:"a64b2578",59599:"1e1f8072",59949:"5c6f6ba9",60071:"9eb2dfca",60365:"bd118f84",60759:"719163ad",60880:"640696ee",60886:"c10a0985",60893:"6fbf0c67",60908:"0eebd274",61114:"3cc71396",61252:"3b66921f",61273:"099a3596",61291:"d38e3f9f",61358:"3d1ae229",61368:"f28f059c",61505:"e58556b2",61730:"b2b2619a",61977:"7570de64",62059:"0893faed",62134:"0d7acd84",62357:"6d2a4d3f",62362:"44463284",62573:"bd1cffff",62814:"7a9b3614",62921:"1d7c691c",62929:"f5fed352",63474:"98c94590",63538:"06393fc1",63706:"2b67eda4",63737:"53e9dd7a",63747:"fb72d7b2",63960:"a6397568",64019:"6fb78fba",64284:"13ee52e7",64558:"b91fbf2a",64641:"eac16e1d",64651:"4c781063",64665:"6f44ab90",65110:"063d75bd",65142:"eb4c176e",65312:"729daf19",65352:"ed3aad8c",65433:"616bfcf6",65542:"af754a1f",65571:"a1df5076",65655:"1ebbfca8",65755:"bafd283f",65784:"90239e6e",65847:"e49a3b4b",65866:"419cd6b8",66225:"9f8e6d57",66339:"03b2528f",66811:"3e87058f",66850:"0c695afe",66868:"3c4af576",66885:"5e253f2f",66912:"51907bd1",66929:"da54b976",67016:"dc576323",67059:"9e6051e1",67068:"ae0eacdd",67098:"a7bd4aaa",67217:"726a6c22",67349:"61ff6850",67458:"0d271e1e",67532:"49fed513",67570:"reactPlayerMixcloud",67706:"e7f4b98d",67714:"9d7352c0",68230:"3cf6fa35",68251:"eaa4efd8",68364:"812775a4",68391:"24557dbc",68700:"96331245",68874:"10ea0b82",68912:"2c2832e4",68915:"62de5d73",68960:"358c2507",68962:"af68ae04",69050:"4ac2e930",69779:"3c9432f0",69816:"20d56cb7",69891:"62037464",69979:"reactPlayerSoundCloud",70115:"52994a20",70326:"c3373259",70669:"b018547e",70843:"a518290b",70934:"d44e0d1c",71247:"308471de",71341:"f7ebdce2",71383:"087cd58c",71826:"a4c89d62",71907:"86a8bb6c",71967:"4fa4eafa",72074:"71319bec",72132:"83ac10ed",72188:"44b88e48",72231:"fe170cc9",72422:"521e3baf",72561:"adce8179",73107:"646cbece",73379:"9d779d8b",73480:"b2aeaed7",73932:"2020ed93",73939:"2ed96714",74081:"ce4dbf6d",74431:"f18da6aa",74520:"9addcfc7",74583:"4bfca71d",74780:"ebde045d",74834:"d26a73b8",74860:"00d14154",74961:"5c7e11fb",75412:"5390e21f",75702:"307525ba",75822:"2db99065",75868:"071f33a8",75965:"b48f41b9",76093:"7d63aba8",76224:"03b3cfd2",76238:"8615e055",76350:"9b933485",76372:"d802bb56",76768:"8bed5a26",76973:"78ae7ec8",77137:"42abcd4d",77313:"ee65edec",77318:"67e77328",77567:"4dc6f423",77757:"f6f476f1",78007:"8eead450",78416:"068743c8",78630:"959ac691",78631:"b7b014bf",78702:"82ea7079",79028:"6b48b7b8",79048:"a94703ab",79052:"6d717251",79225:"526e379a",79354:"4118187a",79526:"75a33358",79628:"a24a5808",79825:"2d4af3bf",79956:"9e09f891",79983:"a7f483d1",80124:"97efa4fc",80190:"be6201fa",80549:"afde3230",80721:"05fa9a60",81291:"a979af25",81445:"74d42203",81509:"4ead9a95",81657:"f8189ec4",81790:"42a9b3c5",81805:"20ff9753",81849:"2e3fc0f9",82075:"056b386b",82099:"52813856",82201:"18910d94",82261:"0c6fe626",82439:"e4eafb12",82477:"2ca08277",83072:"6b5df954",83287:"7af31c45",83294:"6f549117",83720:"d5aabfc9",83752:"efe5610c",83943:"9c5d9512",84092:"19e2305b",84219:"51e50f95",84492:"ba51d442",84605:"8552f549",84656:"813cfb2f",84750:"aefdd881",84850:"bc03f89b",85026:"83fd2af9",85155:"f640cf83",85462:"9270ba4f",85527:"5143312c",85528:"21e10cde",85556:"21a4ba71",85943:"05fbef88",86012:"da202fdd",86037:"eaeab60b",86057:"9fbfaf6d",86106:"1877d9d5",86298:"e2d6ba1f",86546:"8a63049b",86886:"7b33c27b",86887:"reactPlayerFacebook",86992:"3fe65583",87012:"869ae8a7",87126:"b916a1ab",87402:"c3094240",87501:"2674f827",87510:"9d36f238",87760:"0773e78b",88048:"73ca4188",88131:"c2237e68",88494:"504d78e0",88495:"801276a1",88790:"51c7df8c",88843:"45926b62",88946:"95ec96e5",89598:"4b6eee9a",90049:"cc180519",90642:"07006f9e",90780:"098f2604",90899:"609f97b9",90986:"6028a11d",91131:"468d57a9",91194:"cf401e04",91258:"227d1fc4",91395:"a0aa5253",92113:"32b8fafb",92170:"4951b372",92205:"bacd9a7c",92687:"cd64d641",92811:"8093477b",92896:"bc69c5bc",93036:"c342bcae",93087:"b0f19176",93203:"a43ad670",93503:"17e2e969",93833:"9b833276",93842:"26398b18",94205:"39fe1b84",94493:"747fb5d3",94594:"c7507218",94642:"da19ecb4",94725:"dd31e7e9",94811:"da071cb8",95191:"c75d145e",95223:"4f4aa41c",95409:"94f11012",95909:"896258c1",96414:"794a8057",96449:"19a6be06",96815:"8d02075b",96991:"4eee9c87",97034:"0ddd0e66",97191:"31b73615",97289:"233249da",97458:"reactPlayerFilePlayer",97499:"50a12feb",97785:"ac5db01d",97847:"d9df7455",98042:"819b642a",98116:"49849746",98175:"5a96e453",98484:"22302c03",98498:"ae22b856",98548:"44a83f6a",98601:"13798859",98996:"65c67349",99094:"08aab21d",99340:"reactPlayerWistia",99341:"a1154d73",99591:"e0bec135",99644:"1ba60223",99989:"51ddac88"}[e]||e)+"."+{456:"3bf529f7",565:"bed1c850",589:"0befdfa9",762:"d2174ca0",1006:"31f96bab",1160:"bdb31d58",1171:"43543aa9",1441:"fd7b300b",1572:"0cfa3362",1705:"2528c13d",1832:"68bd5dfc",1871:"575e687f",1923:"f4dc4250",1970:"cc3f99ad",2278:"52a102f5",2295:"5302c2da",2316:"6dfad0b4",2496:"48da3b37",2730:"a304021f",3202:"503450b2",3230:"e99996b9",3249:"cad0d93e",3392:"8464e17b",3607:"41af52b1",3705:"08936b46",3783:"04c7a56f",3877:"bbb12f8a",3900:"4eee5db3",4272:"5327c9b2",4276:"0ff680f6",4499:"8a0343dd",4550:"800c1410",4645:"a270f8fb",5e3:"65b6fa57",5268:"c5f6e420",5344:"4fb59513",5352:"5c276b6d",5441:"a0d10636",5547:"f81de728",5623:"b20ed08c",5819:"12ce2193",5827:"3e25f443",5885:"24306e07",6129:"049e2657",6157:"eff98bd1",6215:"31ae42b7",6231:"e9adaca6",6236:"13db7b1d",6262:"e675b845",6265:"12404f60",6308:"2d156f2f",6463:"bec1a06c",6486:"22f47090",6497:"fadb7e82",6615:"e0733f11",6918:"cef59c19",7161:"09ca0649",7267:"2eb42cd5",7606:"b220f86c",7656:"a4a92bc4",7681:"a424d259",7701:"49318b54",7785:"2a8785a9",7848:"8ea818c7",7956:"2e3fbdcc",8271:"cbe74f6b",8349:"5f85a47c",8500:"d7bf511f",8734:"29b499c2",8927:"6f999770",9215:"5574cece",9264:"7fdd1f29",9524:"e29aaf6f",9606:"1957caed",9640:"6a5d88d6",9647:"cac24016",9671:"e8d1d6ac",9837:"2990961f",10348:"78f9f4e8",10443:"29567304",10700:"ce11f188",10845:"6add59b6",10907:"cf9dba7a",11139:"7e17d20e",11184:"b3a25d5a",11301:"15f51fd1",11567:"37a3cdad",11607:"a1c095dc",11721:"ddee74d7",11784:"3d5cf7c1",11934:"1770953b",11965:"d777c784",12007:"0a983281",12042:"a0c42814",12219:"401c0d07",12237:"a9b0cc23",12716:"5099e1c9",12744:"616414a6",12766:"cb4da8e3",12827:"6118b61c",12902:"444cec4c",13018:"3383df8d",13019:"600402c2",13455:"7278ce8a",13535:"8c2fe49b",13585:"00bae75a",13650:"d1b07f39",14080:"6a723b72",14237:"9cb32cf1",14432:"b2c74608",14578:"9cd22e2b",14936:"082570fa",15066:"95c7a677",15246:"740dce57",15422:"f8904b6d",15447:"04e69fb0",15536:"0591c7e4",15955:"6cdb02af",16029:"a1ecc271",16328:"4fa8d3c8",16602:"031b46ad",16678:"6f234e7f",16869:"81a2a888",16884:"07f5d6a4",16945:"46037186",17021:"481eaf6f",17209:"ad9bd8b6",17289:"48e0340f",17320:"baac871f",17776:"c0410a93",17820:"ecdb30e3",18025:"ec1649c0",18093:"88a93afb",18401:"30c4f83a",18446:"150ff8a0",18776:"01b81203",19049:"cc505400",19738:"5bbb4e27",20033:"4d9de467",20210:"4987d48c",20423:"9464251e",20515:"ed6cf262",20681:"895a60b0",20773:"7b374ff9",20826:"4abb5e3c",21611:"2812dc09",21983:"dbbb4174",22309:"248029f7",22422:"7b57c7c1",22447:"67663617",22451:"0d9f4fa7",22611:"66463762",22701:"8b651e24",22750:"a8cb4c36",23321:"2095330e",23452:"52cb7538",23453:"2cb5d6e7",23619:"d3f9ca62",23870:"0c70301a",23983:"34ff443e",24078:"40b61f09",24158:"9e048aeb",24295:"b02c6044",24636:"63cf56d9",24796:"6cf0f3ca",24832:"7934d2f9",25362:"969e76f4",25427:"f4fc9661",25504:"c5325f85",25666:"49b116a0",25691:"b202a53f",25692:"22af4f62",26173:"076fef9c",26376:"82580212",26411:"02cefa64",26499:"ed5ef33e",26622:"33a2684a",26766:"939d4598",27168:"ea09aa96",27350:"b622f983",27547:"02ef84ba",27646:"ab0d6065",27685:"2e22137f",27740:"085fef8a",27800:"c67865e5",28235:"1004749b",29248:"098f61c2",29250:"748fbf44",29285:"c6a44719",29436:"4d0944b8",29773:"3ce3a554",30067:"89867601",30248:"63c91dea",30418:"5eff8ee1",30473:"3550d0ba",30528:"d0410269",30765:"2cb51d03",30773:"a71ee3b7",30799:"17eeaa9c",30941:"c3f340a8",31080:"f9af4c7d",31165:"2403bfef",31267:"4162a3e6",31471:"9b6dda95",31474:"d994a20f",31727:"1543b3aa",32055:"a70c3cf6",32096:"49650e68",32111:"a59aa3ce",32141:"94108e98",32163:"c9c0455c",32178:"f452c1e3",32406:"388ba990",32461:"df6ca91d",32492:"0022b426",32504:"a3895f2a",32741:"f7508f8d",32744:"eddf052b",32759:"c7341e25",32789:"eef1db39",32944:"3ad81361",33048:"180175a3",33098:"b42f86fd",33460:"1321c8ed",33577:"a15d143b",33588:"cd17ca2f",33701:"25bfd469",33992:"b6f5c86d",34321:"3fca4d77",34438:"60e905e1",34662:"fb2368a3",34726:"72d38370",34750:"1e7df9e7",34935:"2d5f4656",34975:"e4112614",35223:"d00b6e10",35540:"87aff258",35563:"ea252326",35654:"07e62338",35742:"e08a145a",35748:"7b09cedb",35884:"22aa93e5",36058:"6a13b234",36100:"0502fbc3",36132:"937c33f0",36353:"4de9bab6",36572:"edfed652",36731:"658424dc",36886:"8aaaa526",36920:"2ffe0535",37107:"457955a3",37296:"c4fdf168",37516:"ae64149c",37655:"a4336309",37710:"f06b9e79",37758:"4da11cb1",37850:"6e674056",37990:"d75149ed",38031:"f0396c00",38419:"c1191973",38471:"fe6a6334",38527:"15bc909b",38610:"8b43a310",38691:"16fea600",38717:"2a439f75",38792:"89e64fc5",38853:"a5515f03",38864:"72f6fb46",39026:"5334a226",39056:"ee74fe7d",39080:"b0585cee",39228:"441ef16c",39294:"9634b173",39408:"422c6350",39431:"529c6ee9",39482:"4451e89f",39503:"18fac5cf",39558:"74c339d9",39757:"e8a4973d",39823:"653ca755",39911:"46e0568e",40271:"5e6bd9c0",40374:"7ed0227f",40563:"2a5279fd",40575:"149c4540",41237:"78ef8b62",41507:"83abc862",41865:"01c485ca",42083:"a1723a5f",42206:"18d5693f",42434:"532ca6ec",42800:"fa5732a8",42901:"da14ef8e",43174:"1ae5b0b4",43246:"c0703b79",43444:"7d8b1654",43773:"1b7ff4ab",43834:"4f342163",43848:"92cfe76c",43888:"aa8fd92a",43903:"e4c94057",43949:"29ab9758",44046:"8058817e",44103:"0c150d88",44141:"fb31070e",44164:"0218091d",44189:"c688c3ac",44486:"0d44e3b2",44602:"0f818018",44609:"461b4926",44630:"e873d45b",44769:"ad7087e8",44816:"76259a84",44947:"793e3f30",45072:"17eb9a78",45141:"0422a0ee",45268:"cfd0889c",45295:"4248d016",45474:"49030196",45655:"6beda4fc",45679:"c8514dc5",45724:"3d7416ea",45742:"f2db22e3",46119:"5d911f90",46268:"cebacb03",46364:"7fab948c",46429:"0275aaf8",46563:"798407c3",46643:"5cd43758",46688:"9745b4ab",46921:"97629923",46961:"8a1f635a",47108:"06b66793",47120:"78fb2058",47127:"76fbb443",47256:"57880651",47264:"4aed6d18",47322:"f0ea7d7b",47341:"0492598d",47452:"5e9a2459",47472:"063e336f",47527:"0e612b80",47627:"bb35fa43",47719:"16d15d6b",47758:"e8864681",48099:"9dc1013b",48124:"a99c83c4",48134:"8bdfbff2",48235:"8037e889",48276:"0ac13bb2",48436:"61a45365",48552:"4a8f654e",48579:"78921083",48665:"0ada6aae",49316:"5363916a",49406:"424eb54b",49455:"648c4ce5",49625:"80c70c34",49658:"c4861fb8",49921:"fc6d4e12",50041:"7ed6da9f",50404:"8fb196bc",50734:"c4703693",50765:"616b4b7f",50908:"0ee266e6",51143:"1b201809",51205:"010f2df3",51349:"e99f8c5a",51379:"493dd3c5",51637:"ff7c1499",51780:"b133e3d9",51782:"2d007aca",51865:"3a6d59b9",52302:"c6b53e5d",52365:"b26e6537",52529:"9c10b4e2",52723:"3e4df075",52961:"a184b649",53084:"bdba8810",53148:"011ea0b4",53357:"b36dd3e8",53774:"e1ef7d5d",54049:"eee29418",54220:"8448c1c4",54530:"23a82c91",54582:"a5d7603c",54705:"3f738e4b",54905:"bc44bc6d",55011:"a6788f4d",55324:"148ff9a6",55388:"4fe45eee",55664:"17b9e76d",56264:"6318e439",56282:"3e130e49",56417:"0cd41893",56420:"7334a2e9",56449:"62146a1b",56532:"0263ed6f",56660:"b925dfa2",56684:"f0421b7a",56764:"8b28de2e",57035:"e5ba70d9",57356:"ab90e540",57694:"817841bd",57790:"794c39eb",57869:"7d3d53bd",58022:"760b5b6c",58718:"afd35ec4",58800:"0930c9ed",59032:"5f666fa6",59075:"71f01f4d",59221:"7947d799",59327:"2ee22f03",59409:"2cccb1fe",59599:"dcf9c22e",59949:"b6f2d6a3",60071:"e18d75db",60365:"c53174c4",60759:"979081a2",60880:"4a5af84f",60886:"2988e127",60893:"262267dc",60908:"631ff7e3",61114:"dfddc8b1",61252:"d531b1a5",61273:"a36f2fd4",61291:"6cda27f6",61358:"1867a69b",61368:"aeef1db6",61505:"1a21d780",61730:"6ea4f6a4",61977:"32a24abf",62059:"34998d9d",62134:"9ffaf69c",62357:"7888230a",62362:"6e67f6cf",62573:"432f0db1",62814:"e4db8fbd",62921:"aeda3551",62929:"90a8e262",63474:"bdf60564",63538:"49330bae",63706:"79076a44",63737:"8dc4c8aa",63747:"4a61d19d",63960:"ec034579",64019:"28758d03",64284:"2bd77eda",64558:"4d1cac39",64641:"913ae86b",64651:"0f464cda",64665:"76eda960",65110:"a963d653",65142:"b24dbfa5",65312:"8f50addd",65352:"24ab1a2a",65433:"a26cc163",65542:"e83efb34",65571:"542635f9",65655:"486883bf",65755:"7fde95d5",65784:"c9e4936e",65847:"1c50deb4",65866:"70fe52c2",66225:"1845c31b",66339:"bd5d4432",66811:"0da3ceb7",66850:"a8558aef",66868:"c54fe4d0",66885:"3909e763",66912:"acc66a5a",66929:"d218d95f",67016:"f8e07181",67059:"ed96df7a",67068:"36e6731b",67098:"03929b29",67217:"f0457378",67349:"4808f8ab",67458:"5bae4e2e",67532:"0f008a1a",67570:"12aff88e",67706:"b0edda93",67714:"7fbd772f",68230:"8cdcec50",68251:"27190b16",68364:"3826ed74",68391:"15261a3f",68700:"878eb230",68874:"e157169d",68912:"868278bd",68915:"0ed0c714",68960:"5c27a458",68962:"70b6a4d6",69050:"24536720",69779:"f46c10f0",69816:"cd56545f",69891:"3eb6da45",69979:"f8f19bc3",70115:"6fdf9a7d",70326:"23742192",70669:"1c903b6c",70843:"18511ed0",70934:"aacde903",71247:"444da1bc",71341:"704bb2ba",71383:"9560230b",71826:"91727c5e",71907:"6087ac78",71967:"515cc3c8",72074:"9823718c",72132:"61d0fb6e",72188:"c6457b90",72231:"a16562c3",72422:"13084b4a",72561:"b8c15734",73107:"c8f5d06c",73379:"f8579888",73480:"53c5dffd",73932:"7e71812f",73939:"1bcf9a4e",74081:"f369eae2",74431:"05faa640",74520:"26e37902",74583:"8fcc3b93",74780:"9ef3091a",74834:"6e4020d0",74860:"8b2e9676",74961:"18868c0e",75412:"851da555",75702:"af81e46c",75822:"af84bb3c",75868:"73753a39",75965:"87f800a3",76093:"5e402a98",76224:"4a337291",76238:"37095157",76350:"cdc406f8",76372:"427b7110",76768:"ec9c773c",76973:"36cad622",77137:"aedda13e",77313:"7c49672d",77318:"079c2535",77567:"f077f609",77757:"55c5f717",78007:"bffb3aa0",78416:"92157af7",78630:"52cb145d",78631:"32793266",78702:"e42a8268",79028:"1c5e1b17",79048:"0f54d2a9",79052:"2597209b",79225:"2b405a5e",79354:"c4b8e5cf",79526:"8c4d4ea3",79628:"aba47b7f",79825:"487d4fe6",79956:"b44a93bb",79983:"8fb557e5",80124:"cf03d623",80190:"2151b287",80549:"927ce320",80721:"724f52f5",81291:"34d69721",81445:"8e63aeb1",81509:"ffa79dd6",81657:"e9c4c968",81790:"70944d29",81805:"06277f56",81849:"7c7a86cc",82075:"05c5cb73",82099:"ceeaa266",82201:"abce6fa4",82237:"787c04ec",82261:"56d05024",82439:"6e17edce",82477:"c1a9fb74",83072:"4a3c32da",83287:"3bd3171e",83294:"99d774e2",83720:"f1655082",83752:"0e738f7e",83943:"a64bf43a",84092:"8037d74d",84219:"c9a52c69",84492:"aac2578e",84605:"dda220f4",84656:"ee4b1f89",84750:"3cb9395a",84850:"30a1320a",85026:"b146d7bd",85155:"f5746601",85462:"8305afa0",85527:"cd83bdd9",85528:"74b87448",85556:"8952cc16",85943:"47cbb047",86012:"713ed951",86037:"3e3ca792",86057:"390bd7e1",86106:"28a6ab59",86298:"2b90b295",86546:"5dd8e541",86886:"25742600",86887:"508da014",86992:"813995a0",87012:"9b3d3cfe",87126:"70ffb610",87402:"211c0534",87501:"ed510fe4",87510:"3ce53dbf",87760:"d2b2d2c3",88048:"fcbe8eff",88131:"b632d02c",88494:"f9f8f001",88495:"452f0be1",88790:"84a2be5e",88843:"152ff9f1",88946:"d896746f",89598:"9564b3ff",90049:"631f2ec4",90642:"b825e084",90780:"3a2bb595",90899:"dce9458d",90986:"7bcc0576",91131:"d5558d28",91194:"407298e3",91258:"15aee314",91395:"16f406a0",92113:"4ea6c011",92170:"83684ee4",92205:"7094ab16",92687:"bb260a5c",92811:"a99fae46",92896:"bdb85543",93036:"51251aca",93087:"64286f41",93203:"09ea14b1",93503:"89a06a4a",93833:"bad49015",93842:"99bd467c",94205:"c4d761cb",94493:"f1fe028b",94594:"705d29b8",94642:"88355706",94725:"6d9c4ec3",94811:"37da4193",95191:"dc4962af",95223:"7d26a2a6",95409:"8393e70e",95909:"d9e176aa",96414:"68c49e52",96449:"bd671d71",96815:"28aa9d74",96991:"c38bcb59",97034:"8a120790",97191:"8f5992aa",97289:"b468ced8",97458:"036de6e1",97499:"c9fc3141",97785:"62f0f347",97847:"a4d3ea63",98042:"a7352085",98116:"bdc39478",98175:"b82b2d9f",98484:"480e97fc",98498:"90e26889",98548:"290650fe",98601:"9ad80dce",98996:"8b6044d3",99094:"bb03c5f6",99340:"c5c0cf6c",99341:"f242f189",99591:"823e72a3",99644:"134ec1cf",99989:"4039096e"}[e]+".js",t.miniCssF=e=>{},t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),t.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},c="serverpod-docs:",t.l=(e,a,d,b)=>{if(f[e])f[e].push(a);else{var r,o;if(void 0!==d)for(var l=document.getElementsByTagName("script"),n=0;n{r.onerror=r.onload=null,clearTimeout(s);var c=f[e];if(delete f[e],r.parentNode&&r.parentNode.removeChild(r),c&&c.forEach((e=>e(d))),a)return a(d)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=u.bind(null,r.onerror),r.onload=u.bind(null,r.onload),o&&document.head.appendChild(r)}},t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.p="/",t.gca=function(e){return e={13798859:"98601",16116660:"32178",17896441:"18401",44145933:"43848",44463284:"62362",49849746:"98116",52398098:"3705",52813856:"82099",53998120:"53774",62037464:"69891",68401255:"20210",79840965:"3877",91633089:"7656",92466816:"39911",96331245:"68700",96523456:"24295",cb867d98:"456","3f04b2f3":"565","3f4d54c7":"589",cdc118a8:"762",f8dd123c:"1006","638e38ae":"1160",b685e31b:"1171",af9b8c85:"1441","02c0cfe0":"1572","1921e4ca":"1705",bdc5a52e:"1832","2796447e":"1871",b32c213b:"1923",dbf9e27d:"1970","27e827f8":"2278","0a5c01b2":"2295",a1610459:"2316","3874f1bf":"2496",ac6e050c:"2730","8e7261c9":"3202","9d217e1f":"3230","05ec9480":"3249",reactPlayerVidyard:"3392",d8d6d57b:"3607",a6c3ea4a:"3783",ecb3c634:"3900","17dc776d":"4272","7a3d47b3":"4276",f149b10e:"4499",e3443ce0:"4550","9644aa4e":"4645",da698f4c:"5000",beab84d5:"5268","8baf194b":"5344","52f87500":"5352",af1c5d2b:"5441",ebd4b56d:"5547","10ad1fa6":"5623",e4a796aa:"5819","3d277f18":"5827","3e4a4cb2":"5885",c56bdfca:"6129",cce58fe7:"6157",f3467f26:"6215","61285fa7":"6231",a8c1f82d:"6236","27b43779":"6262","46b54090":"6265","2890c80c":"6308",reactPlayerKaltura:"6463","2e1ee4ed":"6486","5112ebe3":"6497","7b06977d":"6615","89b55a09":"6918","19e323d1":"7161","2db5c390":"7267","7517a61c":"7606","7da54b54":"7681",c2b45dbb:"7701","95bf5f56":"7785","2581590c":"7848","51dd138a":"7956","94b2bc9a":"8271","06a408fe":"8349","4c5c4c2e":"8500","82e43b76":"8734",b8787c81:"8927","02e914fe":"9215","1caa8cdb":"9264",daec0d60:"9524","4519f039":"9606","5589c54d":"9640","5e95c892":"9647",e64edb60:"9671","5a0a1617":"9837",fca5fdb4:"10348","0931faae":"10443","313c9eb1":"10700","5c1eff22":"10845",f7ae65ac:"10907",dc7352a7:"11139","8af032d3":"11184",f584139f:"11301","22dd74f7":"11567",ef2492df:"11607","10e267de":"11721","45dd886d":"11784",b809d820:"11934","1457ddcd":"11965","90ec8c6b":"12007",reactPlayerTwitch:"12042","3e3aae1a":"12219",b6f81eaa:"12237",d2aa311d:"12716","9de020c4":"12744","4934de22":"12766","28967b3e":"12827",f02fca7f:"12902","076cf272":"13018",d3938b1f:"13019","5839343c":"13455",e84b4e80:"13535",ea237062:"13585","2d11a680":"13650",f4322d5c:"14080","95a5d2b2":"14237",f5e72c0a:"14432","8612c3ac":"14578","7c8e5227":"14936",fe3f3783:"15066","83c6f999":"15246",fc471c47:"15422","30bd0f5b":"15447",baba055e:"15536",fe7002a3:"15955",e839f599:"16029",reactPlayerDailyMotion:"16328","616631fd":"16602","710ac1c1":"16678","444a6d4e":"16869","4ed1e0ac":"16884","5596dd05":"16945","828ace52":"17021",f9bde383:"17209","45939ed5":"17289","55f37562":"17320","070c8c93":"17776",ebd05845:"17820","4b539d9d":"18025","0841186f":"18093",reactPlayerYouTube:"18446",c36ed66b:"18776","2fca5c64":"19049","87ab7385":"19738","986f0f98":"20033","22f51758":"20423","704545ab":"20515",e66f2658:"20681",d4fc3158:"20773","4ab30eec":"20826","82444e58":"21611","57012fa6":"21983","3020aab5":"22309",d3af5b3c:"22422",ceb48fe7:"22447",f5a589e7:"22451","59df87e8":"22611",fb6429ba:"22701","141135bb":"22750","676f1bdb":"23321","5af30237":"23452",ed64c12e:"23453",f6affd6e:"23619","956829f8":"23870","44dc7864":"23983",ec91ff36:"24078","1d39c85d":"24158",d158719f:"24636","8423508e":"24796","02e41de2":"24832","5bc657fa":"25362","3edac44d":"25427","0f2c2e36":"25504","522ca66b":"25666","9a594c98":"25691","7ca2e59a":"25692",reactPlayerVimeo:"26173","431ffdb5":"26376","93ae665a":"26411",a4adf53f:"26499",d9107a6a:"26622",fe33edfa:"26766","7ac69e68":"27168","65e04ea3":"27350","5cc14181":"27547","12407b36":"27646","6aee17c2":"27685","38e32826":"27740","2a36564f":"27800","965931d7":"28235","4a49065b":"29248",dec2bd4a:"29250","7607a467":"29285",dc8c27bd:"29436","1a84c7fd":"29773","373bc822":"30067",b1218054:"30248","6feb7661":"30418","3141060a":"30473","1323771c":"30528","85d514f3":"30765","38e9742f":"30773","1a39ee04":"30799","4aa94ec1":"30941","626d8d5f":"31080","926056c1":"31165","08d55cf7":"31267","3f80bb14":"31471","564db590":"31474","2e18ba50":"31727","9037180b":"32055",c090764b:"32096",f8fee680:"32111",df1414bb:"32141","3d150a24":"32163","5cde491b":"32406",a6311318:"32461","4e689a0b":"32492","7de3e81f":"32504",d9e7b984:"32741",fde0b76a:"32744","7800d508":"32759",f9de1e68:"32789","272aa200":"32944","25c6d77a":"33048","71ba2dc1":"33098","9107c65f":"33460",a32c313f:"33577","10933a93":"33588","4e5965c3":"33701",cbf3c4ec:"33992","6f56eca8":"34321","54cab4d4":"34438",cf3c245e:"34662","1b6591f7":"34726","07e708e9":"34750","6da448d1":"34935",ff5ed6ba:"34975",db7d4591:"35223",ce86e3e6:"35540",e7977816:"35563",dc4059b2:"35654",aba21aa0:"35742","1312139a":"35748","9c9052d1":"35884",a2a1c245:"36058",e7dfb2de:"36100",e8f4756d:"36132",reactPlayerPreview:"36353","3aa84b2d":"36572",bd568e77:"36731","8abbb0ee":"36886",ed772d97:"36920","3817c387":"37107",a2757506:"37296","9f1829f0":"37516","6decf956":"37655",abd13aa2:"37710","0e764995":"37758",b28bd8b1:"37850","441fd5fc":"37990","8ee9837e":"38031",bd6f2233:"38419",caf7731d:"38471","5e7d099e":"38527",c868bccf:"38610","036b5431":"38691","897331c0":"38717","4f0519c7":"38792",fc67ad3d:"38853",fac0eceb:"38864",c7156cf2:"39026","5f6b1733":"39056","511f9951":"39080","27cc7342":"39228","438ea691":"39294",fe2e2e26:"39408",cdd4a9c6:"39431","327b0a57":"39482","50f2f9f3":"39558","9e0c2c37":"39757","5ed5f7a9":"39823","6a734661":"40271",b5dcbe95:"40374","39dec3ba":"40563","33c1d41a":"40575","88a48c42":"41237","16b03284":"41507",fe76eed8:"41865","4048090e":"42083","91aed80e":"42206","5b2d7e3c":"42434","3aa0ab0a":"42800","2115313f":"42901","6ba85e75":"43174","2d16d24d":"43246",d2f6d210:"43444",a81cb65f:"43773","3bff9c7c":"43834",ad61550a:"43888","8186ecf9":"43903","9aaed8b4":"43949","5d707891":"44046","75829dda":"44103",cb43ed9b:"44141",a24f0440:"44164",f5602aa3:"44189",c0650537:"44486","69fcd2fc":"44602",c5313007:"44609","65b7208a":"44630","4a7af9ca":"44769","36fcb744":"44816","39ec0930":"44947","7c299f6a":"45072",b1394c86:"45141",ef4456b5:"45268",f29fc884:"45295","79d28454":"45474","4a55fe3a":"45655","50d72525":"45679","8dfd8953":"45724",c377a04b:"45742",d58f1ee2:"46119","26ad82e9":"46268",fe522f67:"46364","6e1b24e9":"46429",aeef55f7:"46563","53d20392":"46643",ac3101e9:"46688",d0b9ca74:"46921","2bbc2deb":"46961","075f0e80":"47108",dcbfe205:"47120","999788b8":"47127","7b09383e":"47256",b9ec56c8:"47264",a7f9f0ff:"47322","7f0714d1":"47341",a7b0b2b7:"47452","71f9ed0c":"47472","93dcedec":"47527",reactPlayerStreamable:"47627",b7ea99f7:"47719","1b9544a9":"47758","12a78962":"48099","8f509517":"48124","356ce494":"48134",df15bc7d:"48235",b467d32a:"48276",f6adf820:"48436","954e932f":"48552","566f49fb":"48579","0f4a5c74":"48665","510b9307":"49316",b26210db:"49406",c8139b75:"49455",ff61db29:"49625","0d76317c":"49658",fc8b5a5d:"49921",ac002d2b:"50041","98f4e1ec":"50404",eb44eb85:"50734",bf519c8d:"50765","3fbaac07":"50908",fc6f07d2:"51143",db42f242:"51205","4aec9039":"51349","17f04a83":"51379","81e4ed6a":"51637",eecc43ff:"51780","09ca145d":"51782",a768738b:"51865",e7ee6027:"52302","280af06a":"52365",e3d58533:"52529",reactPlayerMux:"52723","8bf57c9f":"52961","23975af2":"53084","9b4ab8cd":"53148","1577f7ed":"53357","4867e743":"54049","092bf57d":"54220",a271ef09:"54530","984d6493":"54582","33af2f09":"54705","98d962c5":"54905","49145cdf":"55011",c94e1931:"55324",b2419a00:"55388","169f3d24":"55664","46eeb6cb":"56264",d636c09f:"56282","538bb064":"56417",fd4b36bb:"56420","6bb5bff7":"56449","4205d879":"56532",f30d2866:"56660","378935ce":"56684","805a59dc":"56764",f527bef3:"57035",bb9c591b:"57356","21b7a589":"57694","1b218eaa":"57790",a7edc2bd:"57869",c134ef8a:"58022",afb7a97b:"58718","5144cf5e":"58800","8ffcd916":"59032","6e29a506":"59075","76259cc3":"59221","03db70c9":"59327",a64b2578:"59409","1e1f8072":"59599","5c6f6ba9":"59949","9eb2dfca":"60071",bd118f84:"60365","719163ad":"60759","640696ee":"60880",c10a0985:"60886","6fbf0c67":"60893","0eebd274":"60908","3cc71396":"61114","3b66921f":"61252","099a3596":"61273",d38e3f9f:"61291","3d1ae229":"61358",f28f059c:"61368",e58556b2:"61505",b2b2619a:"61730","7570de64":"61977","0893faed":"62059","0d7acd84":"62134","6d2a4d3f":"62357",bd1cffff:"62573","7a9b3614":"62814","1d7c691c":"62921",f5fed352:"62929","98c94590":"63474","06393fc1":"63538","2b67eda4":"63706","53e9dd7a":"63737",fb72d7b2:"63747",a6397568:"63960","6fb78fba":"64019","13ee52e7":"64284",b91fbf2a:"64558",eac16e1d:"64641","4c781063":"64651","6f44ab90":"64665","063d75bd":"65110",eb4c176e:"65142","729daf19":"65312",ed3aad8c:"65352","616bfcf6":"65433",af754a1f:"65542",a1df5076:"65571","1ebbfca8":"65655",bafd283f:"65755","90239e6e":"65784",e49a3b4b:"65847","419cd6b8":"65866","9f8e6d57":"66225","03b2528f":"66339","3e87058f":"66811","0c695afe":"66850","3c4af576":"66868","5e253f2f":"66885","51907bd1":"66912",da54b976:"66929",dc576323:"67016","9e6051e1":"67059",ae0eacdd:"67068",a7bd4aaa:"67098","726a6c22":"67217","61ff6850":"67349","0d271e1e":"67458","49fed513":"67532",reactPlayerMixcloud:"67570",e7f4b98d:"67706","9d7352c0":"67714","3cf6fa35":"68230",eaa4efd8:"68251","812775a4":"68364","24557dbc":"68391","10ea0b82":"68874","2c2832e4":"68912","62de5d73":"68915","358c2507":"68960",af68ae04:"68962","4ac2e930":"69050","3c9432f0":"69779","20d56cb7":"69816",reactPlayerSoundCloud:"69979","52994a20":"70115",c3373259:"70326",b018547e:"70669",a518290b:"70843",d44e0d1c:"70934","308471de":"71247",f7ebdce2:"71341","087cd58c":"71383",a4c89d62:"71826","86a8bb6c":"71907","4fa4eafa":"71967","71319bec":"72074","83ac10ed":"72132","44b88e48":"72188",fe170cc9:"72231","521e3baf":"72422",adce8179:"72561","646cbece":"73107","9d779d8b":"73379",b2aeaed7:"73480","2020ed93":"73932","2ed96714":"73939",ce4dbf6d:"74081",f18da6aa:"74431","9addcfc7":"74520","4bfca71d":"74583",ebde045d:"74780",d26a73b8:"74834","00d14154":"74860","5c7e11fb":"74961","5390e21f":"75412","307525ba":"75702","2db99065":"75822","071f33a8":"75868",b48f41b9:"75965","7d63aba8":"76093","03b3cfd2":"76224","8615e055":"76238","9b933485":"76350",d802bb56:"76372","8bed5a26":"76768","78ae7ec8":"76973","42abcd4d":"77137",ee65edec:"77313","67e77328":"77318","4dc6f423":"77567",f6f476f1:"77757","8eead450":"78007","068743c8":"78416","959ac691":"78630",b7b014bf:"78631","82ea7079":"78702","6b48b7b8":"79028",a94703ab:"79048","6d717251":"79052","526e379a":"79225","4118187a":"79354","75a33358":"79526",a24a5808:"79628","2d4af3bf":"79825","9e09f891":"79956",a7f483d1:"79983","97efa4fc":"80124",be6201fa:"80190",afde3230:"80549","05fa9a60":"80721",a979af25:"81291","74d42203":"81445","4ead9a95":"81509",f8189ec4:"81657","42a9b3c5":"81790","20ff9753":"81805","2e3fc0f9":"81849","056b386b":"82075","18910d94":"82201","0c6fe626":"82261",e4eafb12:"82439","2ca08277":"82477","6b5df954":"83072","7af31c45":"83287","6f549117":"83294",d5aabfc9:"83720",efe5610c:"83752","9c5d9512":"83943","19e2305b":"84092","51e50f95":"84219",ba51d442:"84492","8552f549":"84605","813cfb2f":"84656",aefdd881:"84750",bc03f89b:"84850","83fd2af9":"85026",f640cf83:"85155","9270ba4f":"85462","5143312c":"85527","21e10cde":"85528","21a4ba71":"85556","05fbef88":"85943",da202fdd:"86012",eaeab60b:"86037","9fbfaf6d":"86057","1877d9d5":"86106",e2d6ba1f:"86298","8a63049b":"86546","7b33c27b":"86886",reactPlayerFacebook:"86887","3fe65583":"86992","869ae8a7":"87012",b916a1ab:"87126",c3094240:"87402","2674f827":"87501","9d36f238":"87510","0773e78b":"87760","73ca4188":"88048",c2237e68:"88131","504d78e0":"88494","801276a1":"88495","51c7df8c":"88790","45926b62":"88843","95ec96e5":"88946","4b6eee9a":"89598",cc180519:"90049","07006f9e":"90642","098f2604":"90780","609f97b9":"90899","6028a11d":"90986","468d57a9":"91131",cf401e04:"91194","227d1fc4":"91258",a0aa5253:"91395","32b8fafb":"92113","4951b372":"92170",bacd9a7c:"92205",cd64d641:"92687","8093477b":"92811",bc69c5bc:"92896",c342bcae:"93036",b0f19176:"93087",a43ad670:"93203","17e2e969":"93503","9b833276":"93833","26398b18":"93842","39fe1b84":"94205","747fb5d3":"94493",c7507218:"94594",da19ecb4:"94642",dd31e7e9:"94725",da071cb8:"94811",c75d145e:"95191","4f4aa41c":"95223","94f11012":"95409","896258c1":"95909","794a8057":"96414","19a6be06":"96449","8d02075b":"96815","4eee9c87":"96991","0ddd0e66":"97034","31b73615":"97191","233249da":"97289",reactPlayerFilePlayer:"97458","50a12feb":"97499",ac5db01d:"97785",d9df7455:"97847","819b642a":"98042","5a96e453":"98175","22302c03":"98484",ae22b856:"98498","44a83f6a":"98548","65c67349":"98996","08aab21d":"99094",reactPlayerWistia:"99340",a1154d73:"99341",e0bec135:"99591","1ba60223":"99644","51ddac88":"99989"}[e]||e,t.p+t.u(e)},(()=>{var e={45354:0,71869:0};t.f.j=(a,d)=>{var f=t.o(e,a)?e[a]:void 0;if(0!==f)if(f)d.push(f[2]);else if(/^(45354|71869)$/.test(a))e[a]=0;else{var c=new Promise(((d,c)=>f=e[a]=[d,c]));d.push(f[2]=c);var b=t.p+t.u(a),r=new Error;t.l(b,(d=>{if(t.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var c=d&&("load"===d.type?"missing":d.type),b=d&&d.target&&d.target.src;r.message="Loading chunk "+a+" failed.\n("+c+": "+b+")",r.name="ChunkLoadError",r.type=c,r.request=b,f[1](r)}}),"chunk-"+a,a)}},t.O.j=a=>0===e[a];var a=(a,d)=>{var f,c,b=d[0],r=d[1],o=d[2],l=0;if(b.some((a=>0!==e[a]))){for(f in r)t.o(r,f)&&(t.m[f]=r[f]);if(o)var n=o(t)}for(a&&a(d);lCapabilities | Serverpod
-
+
diff --git a/docs/concepts/authentication/basics.html b/docs/concepts/authentication/basics.html
index a19b5267eb..b19a99acee 100644
--- a/docs/concepts/authentication/basics.html
+++ b/docs/concepts/authentication/basics.html
@@ -4,14 +4,14 @@
The basics | Serverpod
-
+
Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the serverpod_auth module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood.
-
The Session object provides information about the current user. A unique userId identifies a user. You should use this id whenever you a referring to a user. Access the id of a signed-in user through the authenticated field of the Session object.
-
Future<void>myMethod(Session session)async{ var userId =(await session.authenticated)?.userId; ... }
+
The Session object provides information about the current user. A unique userId identifies a user. You should use this id whenever you a referring to a user. Access the id of a signed-in user through the authenticated asynchronous getter of the Session object.
+
Future<void>myMethod(Session session)async{ final authenticationInfo =await session.authenticated; final userId = authenticationInfo?.userId; ... }
You can also use the Session object to check if a user is authenticated:
Future<void>myMethod(Session session)async{ var isSignedIn =await session.isUserSignedIn; ... }
This is unreleased documentation for Serverpod Next version.
For up-to-date documentation, see the latest version (2.3.0).
Version: Next
The basics
Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the serverpod_auth module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood.
-
The Session object provides information about the current user. A unique userId identifies a user. You should use this id whenever you a referring to a user. Access the id of a signed-in user through the authenticated field of the Session object.
-
Future<void>myMethod(Session session)async{ var userId =(await session.authenticated)?.userId; ... }
+
The Session object provides information about the current user. A unique userId identifies a user. You should use this id whenever you a referring to a user. Access the id of a signed-in user through the authenticated asynchronous getter of the Session object.
+
Future<void>myMethod(Session session)async{ final authenticationInfo =await session.authenticated; final userId = authenticationInfo?.userId; ... }
You can also use the Session object to check if a user is authenticated:
Future<void>myMethod(Session session)async{ var isSignedIn =await session.isUserSignedIn; ... }