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 99b7faaca..9ec1e06f7 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 c2d06c346..159517f3c 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 4f6fe1429..967561568 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 41f0279b6..58dca53ce 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 8d94f4801..f72fff6cd 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 ef2d411ce..0e4835966 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 2475f0ed1..443eeffcd 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 8450ae7dc..4cd980c25 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 e23896f1b..939b66907 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 94fdcf115..9ffd9681a 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 42f00bb26..1fbb8a6e9 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 17cb5673b..3843f16e2 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 433352295..604e67806 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 4033df497..70d255fff 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 8f2615564..510c0a82d 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 e8bbd7cb0..cb654f2df 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 9f3d5d132..d0f70144f 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 3a810c854..514285455 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 c611eaf37..4fc27fb7e 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 88c5e51db..d98a83e85 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 fd935560e..9e3faf9fb 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 93cc0f9ef..404f309f8 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 cf7cdab04..134793cf8 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 1c4bf2419..0c236cff1 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 c426fc73e..bc7069a8c 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 4679d4a12..d814b2127 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 8e721a9ca..0ea645497 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 6b2ec72dc..ffbd61be4 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 2c98e2784..9a2d2beda 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 f5e273a66..7bedcdb45 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 e118412e2..f6b3c1e0e 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 0b3124840..3e0fdd8e6 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 f7f0de033..145a43b31 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 0b90c0519..f7dde6b1e 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 e52240617..9a796da4c 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 61faf3378..839d581fd 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 6b3e64f0d..680320ab5 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 65187211e..18e1ecbf3 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 bb69acae4..f481538a9 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 53f0896df..68fb1ba85 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 5ba34bac9..79aaac5f8 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 6a39242dd..9dec15d96 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 5391f402c..2e0503a5e 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 357fe7ae8..4c5501a81 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 dcbed57a9..90560a7e5 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 6d17101be..4d637a3ce 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 22656333b..c5432a33b 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 6ff13c8b5..a08261c4a 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 f9ca9848f..e300c8166 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 36bf55211..20f60de6c 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 e574516bc..af16f741c 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 7c4a1f54c..90fe158d2 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 a69f058ef..86aa4b848 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 f1e820774..c8199de12 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 3f438b9f3..65873aa6c 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 d4b7a41f2..7c2355df4 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 7e725f924..af686575d 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 e5410c4bd..02af9521e 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 827ce8656..d5ccb5492 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 28278e544..38d264e42 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 c248d4f3a..7163e6a83 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 da1415156..6ab17dc7d 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 65c5add64..dd193e395 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 2dea9a48e..8ee2a183c 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 5b5eab94c..787bbf9f5 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 731abe5c2..58a19bcd8 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 000000000..d634524ac
--- /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 4078e586d..000000000
--- 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 a6230eb0d..06220cb11 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 65f67835a..91d40f456 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 264685512..88ab7ef44 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 7a6f6bc99..c4f116519 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 a19b5267e..b19a99ace 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; ... }