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

对用户进行身份验证 — .NET SDK

在此页面上

  • 登录
  • 匿名用户
  • 电子邮件/密码用户
  • API 密钥用户
  • 自定义 JWT 用户
  • 自定义函数用户
  • Facebook 用户
  • Google 用户
  • Apple 用户
  • 离线登录
  • 注销用户
  • 检索当前用户
  • 获取用户访问令牌
  • 刷新令牌有效期
  • 观察身份验证变更

SDK 提供了一个 API,用于使用任何已启用的身份验证提供者对用户进行身份验证。实例化一个凭证对象并将其传递给LogInAsync()方法以进行身份验证并获取User实例。 Credentials类公开与每个身份验证提供程序对应的工厂方法:

在对用户进行身份验证之前,请确保您已:

在 App Services 用户界面中启用匿名身份验证后,用户无需提供任何识别信息即可立即登录您的应用。以下代码说明了如何执行此操作:

var user = await app.LogInAsync(Credentials.Anonymous());

如果已启用电子邮件/密码身份验证,则可使用以下代码登录:

var user = await app.LogInAsync(
Credentials.EmailPassword("caleb@mongodb.com", "MySekritPwd"));

如果已启用 API 密钥身份验证,则可使用以下代码登录:

var user = await app.LogInAsync(Credentials.ApiKey(apiKey));

如果已启用自定义 JWT 身份验证提供程序,则可以使用以下代码登录:

var user =
await app.LogInAsync(Credentials.JWT(jwt_token));

如果已启用自定义函数身份验证提供程序,则可以使用以下代码登录:

var functionParameters = new
{
username = "caleb",
password = "MySekritPwd",
IQ = 42,
hasPets = true
};
var user =
await app.LogInAsync(Credentials.Function(functionParameters));

Facebook身份验证提供者允许您使用用户现有的 Facebook 帐户通过 Facebook 应用对用户进行身份验证。

重要

启用 Facebook 身份验证提供者

要使用现有 Facebook 帐户登录用户,必须为应用程序配置并启用 Facebook 身份验证提供者

重要

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

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

var user =
await app.LogInAsync(Credentials.Facebook(facebookToken));

如已启用Google 身份验证,可使用以下代码登录:

var user =
await app.LogInAsync(Credentials.Google(googleAuthCode, GoogleCredentialType.AuthCode));

如果已启用 Apple 身份验证登录,则可以使用以下代码登录:

var user =
await app.LogInAsync(Credentials.Apple(appleToken));

提示

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

当您的 Realm 应用程序对用户进行身份验证时,它会缓存该用户的档案。您可以检查是否存在现有用户档案以绕过登录流程并访问已缓存的用户。使用它可离线打开一个 Realm。

注意

初始登录需要网络连接

当用户注册您的应用或使用客户端上的现有帐户首次登录时,客户端必须具有网络连接。通过检查是否存在已缓存的用户档案,您可以离线打开 Realm,但前提是用户之前已在线登录。

以下示例检查是否存在缓存的 User 对象。 如果没有,则让用户登录。 否则,它将使用缓存的凭证:

if (app.CurrentUser == null)
{
// App must be online for user to authenticate
user = await app.LogInAsync(
Credentials.EmailPassword("caleb@mongodb.com", "MySekritPwd"));
config = new PartitionSyncConfiguration("_part", user);
realm = await Realm.GetInstanceAsync(config);
}
else
{
// This works whether online or offline
user = app.CurrentUser;
config = new PartitionSyncConfiguration("_part", user);
realm = Realm.GetInstance(config);
}

登录后,您可以通过调用LogOutAsync()方法注销:

await user.LogOutAsync();

警告

当用户注销时,您无法再在用户已打开的任何已同步 Realm 中读取或写入数据。因此,在发起用户注销之前尚未完成的所有操作均无法成功完成,且可能会导致错误。以此方式失败的写入操作中的所有数据都将丢失。

拥有经过身份验证的用户后,可以使用App.CurrentUser属性检索用户对象。 CurrentUser对象会持久保存在本地存储中,因此即使应用程序在初始身份验证后关闭,也无需再次调用LoginAsync (除非用户注销)。 请改用Realm.GetInstance(config) ,其中configPartitionSyncConfiguration对象。 这种方法可以加快启动速度,并使用户能够离线工作。

当用户登录时,Atlas App Services 会为用户创建一个访问令牌,以为他们授予访问您应用的权限。Realm SDK 会自动管理访问令牌,在访问令牌过期时对其进行刷新,并在每次请求中为当前用户提供有效的访问令牌。Realm 不会自动对刷新令牌进行刷新。当刷新令牌过期后,用户必须重新登录。

如果在 SDK 外部发送请求,则需要在每个请求中包含用户的访问令牌,并在令牌过期时手动刷新令牌。

您可以在 SDK 中,通过用户的 Realm.User 对象来访问和刷新已登录用户的访问令牌,如下例所示:

// Returns a valid user access token to authenticate requests
public async Task<string> GetValidAccessToken(User user)
{
// An already logged in user's access token might be stale. To
// guarantee that the token is valid, refresh it.
await user.RefreshCustomDataAsync();
return user.AccessToken;
}

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

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

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

v11.6.0 版本新增

您可以通过在有效用户对象上调用User.Changed()来观察身份验证更改事件流。

目前, User.Changed()会在所有用户事件上触发,您应添加处理程序以确保对事件的响应是幂等的。

app.CurrentUser.Changed += (change, _) =>
{
Debug.WriteLine($"Auth change: {change}, {_}");
};

后退

创建和删除用户

来年

自定义用户数据