对用户进行身份验证 - C++ SDK
在此页面上
登录
匿名用户
如果您在App Services用户界面中启用了匿名身份验证,则用户无需提供任何身份信息即可立即日志您的应用。
auto appConfig = realm::App::configuration(); appConfig.app_id = APP_ID; auto app = realm::App(appConfig); auto user = app.login(realm::App::credentials::anonymous()).get();
电子邮件/密码用户
如果您已启用电子邮件/密码身份验证,并注册了电子邮件/密码用户,则可以登录该用户。
auto user = app.login(realm::App::credentials::username_password( userEmail, userPassword)) .get();
API 密钥用户
如果您已启用API Key 身份验证,则可以使用用户 API Key 登录。
auto appConfig = realm::App::configuration(); appConfig.app_id = APP_ID; auto app = realm::App(appConfig); auto user = app.login(realm::App::credentials::api_key(API_KEY)).get();
自定义函数用户
如果您已启用自定义函数 身份验证提供程序,则可以使用自定义函数登录。
auto appConfig = realm::App::configuration(); appConfig.app_id = APP_ID; auto app = realm::App(appConfig); /* Custom function authentication takes a string parameters argument. The parameter details vary depending on how you define your custom authentication function. */ std::string params = "{\"username\": \"bob\"}"; auto user = app.login(realm::App::credentials::function(params)).get();
自定义 JWT 用户
如果您已启用自定义 JSON Web 令牌身份验证提供程序,则可以使用自定义 JSON Web 令牌登录。
auto token = "<jwt>"; auto appConfig = realm::App::configuration(); appConfig.app_id = APP_ID; auto app = realm::App(appConfig); auto user = app.login(realm::App::credentials::custom(token)).get();
Facebook 用户
Facebook身份验证提供者允许您使用用户现有的 Facebook 帐户通过 Facebook 应用对用户进行身份验证。
重要
请勿存储 Facebook 个人资料图片的 URL
Facebook 个人资料图片 URL 包含用户的访问令牌,用于授予该图像的权限。为了确保安全,请勿存储包含用户访问令牌的 URL。相反,在需要获取图像时,可直接从用户的元数据字段访问 URL。
auto appConfig = realm::App::configuration(); appConfig.app_id = APP_ID; auto app = realm::App(appConfig); auto accessToken = "<token>"; auto user = app.login(realm::App::credentials::facebook(accessToken)).get();
Google 用户
如果已配置 Google 身份验证提供者,则可以使用现有的 Google 帐户登录。
要使用 Google 身份验证代码登录,请将 Google 身份验证代码传递给credentials::google_auth_code()。
auto appConfig = realm::App::configuration(); appConfig.app_id = APP_ID; auto app = realm::App(appConfig); // The user's server auth code you got from Google auto myAuthCode = "auth_code_from_google"; auto user = app.login(realm::App::credentials::google_auth_code(myAuthCode)).get();
要使用 Google ID 令牌登录,请将 Google ID 令牌传递给credentials::google_id_token()。
auto appConfig = realm::App::configuration(); appConfig.app_id = APP_ID; auto app = realm::App(appConfig); // The user's OpenID Connect id_token you got from the Google OAuth response auto myIdToken = "open_id_connect_id_token_from_google"; auto user = app.login(realm::App::credentials::google_id_token(myIdToken)).get();
Apple 用户
如果您已启用Sign-in with Apple 身份验证,则可以使用 Apple ID 令牌让用户登录。
auto appConfig = realm::App::configuration(); appConfig.app_id = APP_ID; auto app = realm::App(appConfig); auto idToken = "<token>"; auto user = app.login(realm::App::credentials::apple(idToken)).get();
获取用户访问令牌
Realm SDK 会自动管理访问令牌,在访问令牌过期时对其进行刷新,并在每次请求中为当前用户提供有效的访问令牌。
如果您在 SDK 外部发送请求,则必须在每个请求中包含用户的访问令牌。 在这种情况下,您必须在令牌过期时手动刷新令牌。 访问令牌会在30分钟后过期。
您可以对已登录用户调用.refresh_custom_user_data()来刷新用户的身份验证会话。 然后,获取.access_token() 作为可在代码中使用的string 。 您可以使用与此类似的代码来获取访问令牌:
// With a logged-in user, refresh the custom user data to refresh the auth // session user.refresh_custom_user_data().get(); // Then get the user's access token auto userAccessToken = user.access_token();
刷新令牌有效期
刷新令牌会在设定的时间段后过期。刷新令牌过期后,访问令牌将无法再刷新,用户必须重新登录。
如果刷新令牌在 Realm 打开后过期,则在用户再次登录之前设备无法进行同步。同步错误处理程序应实现在尝试同步时捕获令牌过期错误的逻辑,然后将用户重定向到登录流程。
有关配置刷新令牌过期时间的信息,请参阅 App Services 文档中的管理用户会话。
登出
登录后,您可以注销。
警告
当用户注销时,您无法再在用户已打开的任何已同步 Realm 中读取或写入数据。因此,在发起用户注销之前尚未完成的所有操作均无法成功完成,且可能会导致错误。以此方式失败的写入操作中的所有数据都将丢失。
user.log_out().get();
获取当前用户
您可以使用 app::get_current_user()
获取当前用户:
auto currentUser = app.get_current_user();
确认用户已登录
您可以使用user::is_logged_in()
确认用户已登录:
auto user = app.login(realm::App::credentials::anonymous()).get(); CHECK(user.is_logged_in());