验证用户身份 — Flutter SDK
在此页面上
Atlas App Services提供了一个API ,用于使用任何已启用的身份验证提供者对用户进行身份验证。实例化 档案 对象并将其传递给 App.logIn() 进行身份验证并创建 用户 该用户的对象。每个身份验证提供者都对应一个静态构造函数方法,用于实例化该身份验证提供者的Credentials
对象。
开始之前
启用并配置一个或多个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 身份验证提供者,则可以使用外部身份验证提供者的 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 密钥登录。
要使用 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 身份验证登录,请将 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 身份验证代码登录,请将 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 身份验证登录,请将 Apple 访问令牌传递给 Credentials.apple() 。然后将该档案传递给app.logIn
。
final appleCredentials = Credentials.apple(idToken); final currentUser = await app.logIn(appleCredentials);
提示
如果您收到指示 token contains
an invalid number of segments
的 Login failed
错误,请验证您是否传递了 JWT 的 UTF-8 编码字符串版本。
刷新令牌有效期
刷新令牌会在设定的时间段后过期。刷新令牌过期后,访问令牌将无法再刷新,用户必须重新登录。
如果刷新令牌在 Realm 打开后过期,则在用户再次登录之前设备无法进行同步。同步错误处理程序应实现在尝试同步时捕获令牌过期错误的逻辑,然后将用户重定向到登录流程。
有关配置刷新令牌过期时间的信息,请参阅 App Services 文档中的管理用户会话。
注销用户
您可以使用 User.logOut() 登出任何用户,无论使用哪个身份验证提供者登录。此方法:
从设备中删除本地存储的用户档案
立即停止与用户 Realm 之间的所有双向同步
由于注销会停止同步,因此您应该仅在所有本地 Realm 更新上传到服务器后再注销。
await user.logOut();
检索当前用户
拥有经过身份验证的用户后,您可以使用 App.currentUser 检索用户对象 属性。currentUser
对象会持久保存在本地存储中,因此即使应用程序在初始身份验证后关闭,也无需再次调用logIn
(除非用户注销)。
final user = app.currentUser;