Docs 菜单
Docs 主页
/ /
Atlas Device SDKs
/ /

验证用户身份 — Flutter SDK

在此页面上

  • 开始之前
  • 注册新用户帐户
  • 登录
  • 匿名用户
  • 电子邮件/密码用户
  • 自定义 JWT 用户
  • API 密钥用户
  • 自定义函数用户
  • Facebook 用户
  • Google 用户
  • Apple 用户
  • 刷新令牌有效期
  • 注销用户
  • 检索当前用户

Atlas App Services提供了一个API ,用于使用任何已启用的身份验证提供者对用户进行身份验证。实例化 档案 对象并将其传递给 App.logIn() 进行身份验证并创建 用户 该用户的对象。每个身份验证提供者都对应一个静态构造函数方法,用于实例化该身份验证提供者的Credentials 对象。

  1. 创建 App Services App。

  2. 启用并配置一个或多个Atlas App Services身份验证提供程序。

Realm 会根据身份验证提供者以不同方式注册帐户:

  • 您无需注册匿名用户。

  • 要注册电子邮件/密码用户,请参阅电子邮件/密码用户注册

  • 如果您使用的是 Google、Facebook、Apple 或自定义 JWT 身份验证,注册则由这些第三方服务进行处理。

您可以使用 App.logIn() 对用户进行身份验证。

如成功,则 app.logIn 会返回 User 对象。

匿名身份验证提供者使用户能够使用不存储持久个人信息的短期帐户登录到您的应用程序。 要使用匿名身份验证登录,请通过调用 Credentials.anonymous() 创建匿名档案然后将生成的档案传递给app.logIn

final anonCredentials = Credentials.anonymous();
await app.logIn(anonCredentials);

如果需要多个匿名用户,请在创建其他匿名档案时设置 reuseCredentials: false

final anonUser = await app.logIn(Credentials.anonymous());
final otherAnonUser =
await app.logIn(Credentials.anonymous(reuseCredentials: false));

电子邮件/密码身份验证提供程序使用户能够使用电子邮件用户名和密码登录您的应用程序。 要使用电子邮件/密码身份验证登录,请通过调用 Credentials.emailPassword() 创建电子邮件/密码档案以及用户的电子邮件和密码。 然后将该档案传递给app.logIn

final emailPwCredentials =
Credentials.emailPassword("lisa@example.com", "myStr0ngPassw0rd");
await app.logIn(emailPwCredentials);

要进一步了解使用 App Services 电子邮件/密码身份验证的完整流程,请参阅电子邮件/密码用户

如已配置自定义 JWT 身份验证提供者,则可以使用外部身份验证提供者的 JWT 凭证登录。

JSON web token要使用自定义 身份验证进行登录,请通过调用JSON web token Credentials.jwt() 创建 档案在JSON web token string上。 然后将该档案传递给app.logIn

final token = await authenticateWithExternalSystem();
final jwtCredentials = Credentials.jwt(token);
final currentUser = await app.logIn(jwtCredentials);

如果启用了 API 密钥验证,则可以使用客户端或服务器 API 密钥登录。

要使用 API 密钥身份验证登录,请创建 ApiKey 通过调用 Credentials.apiKey()在API密钥string上。 然后将该档案传递给app.logIn()

final apiKeyCredentials = Credentials.apiKey(myApiKey);
final apiKeyUser = await app.logIn(apiKeyCredentials);

要生成用于凭证的服务器API密钥,请参阅创建MongoDB Server API密钥文档。

如需使用权限与当前登录用户相同的用户 API 密钥,请使用 User.apiKeys 客户端。您可以创建、获取、删除、禁用和启用用户 API 密钥。

// Create user API key
final apiKey = await user.apiKeys.create("api-key-name");
// Get existing user API key by ID
// Returns `null` if no existing API key for the ID
final refetchedApiKey = await user.apiKeys.fetch(apiKey.id);
// Get all API keys for a user
final apiKeys = await user.apiKeys.fetchAll();
// Disable API key
await user.apiKeys.disable(apiKey.id);
// Check if API key is enabled
print(apiKey.isEnabled); // prints `false`
// Enable API key
await user.apiKeys.enable(apiKey.id);
// Delete a user API key
await user.apiKeys.delete(apiKey.id);

如果您已配置自定义函数身份验证提供者,则可使用由 Atlas Function 处理的自定义身份验证逻辑来登录。

要使用自定义函数身份验证登录,请将包含自定义参数的字符串化JSON传递给 Credentials.function() 。然后将该档案传递给app.logIn

final credentials = {
"username": "someUsername",
};
// payload must be a JSON-encoded string
final payload = jsonEncode(credentials);
final customCredentials = Credentials.function(payload);
final currentUser = await app.logIn(customCredentials);

如果配置了 Facebook 身份验证提供者,则可以使用现有 Facebook 账户登录。

要使用 Facebook 身份验证登录,请将 Facebook 访问令牌传递给 Credentials.facebook() 。然后将该档案传递给app.logIn

final facebookCredentials = Credentials.facebook(accessToken);
final currentUser = await app.logIn(facebookCredentials);

重要

请勿存储 Facebook 个人资料图片的 URL

Facebook 个人资料图片 URL 包含用户的访问令牌,用于授予该图像的权限。为了确保安全,请勿存储包含用户访问令牌的 URL。相反,在需要获取图像时,可直接从用户的元数据字段访问 URL。

如果已配置 Google 身份验证提供者,则可以使用现有的 Google 帐户登录。

要使用 Google 身份验证代码登录,请将 Google 身份验证代码传递给 Credentials.googleAuthCode() 。然后将该档案传递给app.logIn

final googleAuthCodeCredentials = Credentials.googleAuthCode(authCode);
final currentUser = await app.logIn(googleAuthCodeCredentials);

要使用 Google ID 令牌登录,请将 Google ID 令牌传递给 Credentials.googleIdToken() 。然后将该档案传递给app.logIn

final googleIdTokenCredentials = Credentials.googleIdToken(idToken);
final currentUser = await app.logIn(googleIdTokenCredentials);

如果您已配置使用 Apple 身份验证提供者进行登录,则可使用现有 Apple 帐户登录。

要使用 Apple 身份验证登录,请将 Apple 访问令牌传递给 Credentials.apple() 。然后将该档案传递给app.logIn

final appleCredentials = Credentials.apple(idToken);
final currentUser = await app.logIn(appleCredentials);

提示

如果您收到指示 token contains an invalid number of segmentsLogin failed 错误,请验证您是否传递了 JWT 的 UTF-8 编码字符串版本。

刷新令牌会在设定的时间段后过期。刷新令牌过期后,访问令牌将无法再刷新,用户必须重新登录。

如果刷新令牌在 Realm 打开后过期,则在用户再次登录之前设备无法进行同步。同步错误处理程序应实现在尝试同步时捕获令牌过期错误的逻辑,然后将用户重定向到登录流程。

有关配置刷新令牌过期时间的信息,请参阅 App Services 文档中的管理用户会话

您可以使用 User.logOut() 登出任何用户,无论使用哪个身份验证提供者登录。此方法:

  • 从设备中删除本地存储的用户档案

  • 立即停止与用户 Realm 之间的所有双向同步

由于注销会停止同步,因此您应该仅在所有本地 Realm 更新上传到服务器后再注销。

await user.logOut();

拥有经过身份验证的用户后,您可以使用 App.currentUser 检索用户对象 属性。currentUser对象会持久保存在本地存储中,因此即使应用程序在初始身份验证后关闭,也无需再次调用logIn (除非用户注销)。

final user = app.currentUser;

后退

管理用户