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

对用户进行身份验证 - Node.js SDK

在此页面上

  • 登录
  • 用户会话
  • 匿名用户
  • 电子邮件/密码用户
  • API 密钥用户
  • 自定义 JWT 用户
  • 自定义函数用户
  • Facebook 用户
  • Google 用户
  • Apple 用户
  • 离线登录
  • 获取用户访问令牌
  • 刷新令牌有效期
  • 注销用户

Realm 提供了一个 API,支持使用任何已启用的身份验证提供者对访问应用程序的用户进行身份验证。实例化一个 Credentials 对象并将其传递给 app.login() 方法,以验证用户登录身份并创建一个 User 对象。

Atlas App Services 使用访问令牌和刷新令牌管理会话。客户端 SDK 提供管理令牌的逻辑,并向其发出请求。

提示

另请参阅:

用户会话

匿名提供程序允许用户使用没有关联信息的临时帐户登录您的应用程序。

要登录,请创建一个匿名凭证并将其传递给 App.logIn()

// Create an anonymous credential
const credentials = Realm.Credentials.anonymous();
const user = await app.logIn(credentials);
// Create an anonymous credential
const credentials = Realm.Credentials.anonymous();
const user = await app.logIn(credentials);

电子邮件/密码身份验证提供者允许用户使用电子邮件地址和密码登录您的应用程序。

要进行登录,请使用用户的电子邮件地址和密码创建电子邮件/密码档案并将其传递给 App.logIn()

// Create an email/password credential
const credentials = Realm.Credentials.emailPassword(
"someone@example.com",
"Pa55w0rd!"
);
const user = await app.logIn(credentials);
// Create an email/password credential
const credentials = Realm.Credentials.emailPassword(
"someone@example.com",
"Pa55w0rd!"
);
const user = await app.logIn(credentials);

API 密钥身份验证提供者允许服务器进程直接或代表用户访问您的应用程序。

要使用 API 密钥进行登录,请使用服务器或用户 API 密钥创建一个 API 密钥档案并将其传递给 App.logIn()

// Get the API key from the local environment
const apiKey = process.env?.appServicesApiKey;
if (!apiKey) {
throw new Error("Could not find a Server API Key.");
}
// Create an api key credential
const credentials = Realm.Credentials.apiKey(apiKey);
const user = await app.logIn(credentials);
// Get the API key from the local environment.
const apiKey = process.env?.appServicesApiKey;
if (!apiKey) {
throw new Error("Could not find a Server API Key.");
}
// Create an api key credential.
const credentials = Realm.Credentials.apiKey(apiKey);
const user = await app.logIn(credentials);

自定义 JSON Web 令牌身份验证提供程序允许您使用任何返回JSON web token的身份验证系统处理用户身份验证。

要进行登录,请使用外部系统中的 JWT 创建自定义 JWT 档案并将其传递给 App.logIn()

// Create a custom jwt credential
const jwt = await authenticateWithExternalSystem();
const credentials = Realm.Credentials.jwt(jwt);
const user = await app.logIn(credentials);
// Create a custom jwt credential.
const jwt = await authenticateWithExternalSystem();
const credentials = Realm.Credentials.jwt(jwt);
const user = await app.logIn(credentials);

自定义函数身份验证提供者允许您通过运行接收有关用户的任意信息有效负载的函数来处理用户身份验证。

要通过自定义函数提供者进行登录,请创建具有负荷对象的自定义函数档案并将其传递给 App.logIn()

// Create a custom function credential
const credentials = Realm.Credentials.function({
username: "ilovemongodb",
});
const user = await app.logIn(credentials);
// Create a custom function credential.
const credentials = Realm.Credentials.function({
username: "ilovemongodb",
});
const user = await app.logIn(credentials);

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

重要

启用 Facebook 身份验证提供者

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

重要

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

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

您可以使用 官方Facebook SDK 处理用户身份验证并重定向来自客户端应用程序的流程。完成身份验证后, Facebook SDK 会返回一个访问权限令牌,您可以将该令牌发送到您的 Node.js应用,并使用该令牌来结束用户登录到您应用的流程。

// Get the access token from the Facebook SDK
const { accessToken } = FB.getAuthResponse();
// Define credentials with the access token from the Facebook SDK
const credentials = Realm.Credentials.facebook(accessToken);
// Log the user in to your app
await app.logIn(credentials);

Google身份验证提供程序允许您使用用户现有的 Google 帐户通过 Google 项目对用户进行身份验证。

注意

启用 Google 身份验证提供者

要对 Google 用户进行身份验证,必须配置 Google 身份验证提供者。您必须启用 OpenID Connect 才能将 Google 身份验证提供者与 Node.js SDK 结合使用。

在应用程序配置中为 Google 用户身份验证设置应用程序:

  1. Google Cloud Platform 控制台 中 ,创建 OAuth2 。0类型为“Web 应用程序”的客户端 ID。

  2. 配置您的后台应用程序,以使用该客户端 ID 和相关的客户端密钥。

  3. 在后端启用 OpenID Connect。

使用官方 Google Auth Library for Node.js 处理用户身份验证并重新定向来自 Node.js 客户端应用程序的流:

  1. 安装 Realm 和 Google APIs npm 程序包。

    npm install realm googleapis
  2. 将包导入到项目中。

    const Realm = require("realm");
    const { google } = require("googleapis");
  3. 为 Google OAuth 2.0 客户端和 Realm 创建配置。

    // Configure and instantiate Google OAuth2.0 client
    const oauthConfig = {
    client_id: GOOGLE_CLIENT_ID,
    project_id: GOOGLE_PROJECT_ID,
    auth_uri: "https://accounts.google.com/o/oauth2/auth",
    token_uri: "https://oauth2.googleapis.com/token",
    auth_provider_x509_cert_url: "https://www.googleapis.com/oauth2/v1/certs",
    client_secret: GOOGLE_CLIENT_SECRET,
    redirect_uris: [`${BASE_URL}/auth/google/callback`],
    JWTsecret: "secret",
    scopes: [
    "https://www.googleapis.com/auth/userinfo.email",
    "https://www.googleapis.com/auth/userinfo.profile",
    "openid",
    // any other scopes you might require. View all here - https://developers.google.com/identity/protocols/oauth2/scopes
    ],
    };
    const OAuth2 = google.auth.OAuth2;
    const oauth2Client = new OAuth2(
    oauthConfig.client_id,
    oauthConfig.client_secret,
    oauthConfig.redirect_uris[0]
    );
    // Instantiate Realm app
    const realmApp = new Realm.App({
    id: REALM_APP_ID,
    });
  4. 生成 OAuth 登录链接,并将其传递给应用程序客户端。

    // generate OAuth 2.0 log in link
    const loginLink = oauth2Client.generateAuthUrl({
    access_type: "offline", // Indicates that we need to be able to access data continuously without the user constantly giving us consent
    scope: oauthConfig.scopes,
    });
  5. 使用 Google OAuth 2.0 客户端的 getToken() 方法处理来自 Google 身份验证服务器的请求,该请求包含查询字符串中的访问代码。在回调函数中,使用 id_token 登录到应用。

    // Get Google token and use it to sign into Realm
    oauth2Client.getToken(authCodeFromQueryString, async function (
    error,
    token
    ) {
    if (error) return errorHandler(error);
    try {
    const credential = Realm.Credentials.google({
    idToken: token.id_token,
    });
    const user = await realmApp.logIn(credential);
    console.log("signed in as Realm user", user.id);
    } catch (error) {
    errorHandler(error);
    }
    });

例子

在 Node.js 服务器上通过 Google 进行身份验证

请参阅 示例Node.js服务器的代码 实现“使用 Google 登录”。所有 Google OAuth 2 。 0 实施位于server.js文件中。

该示例使用 Express 进行路由,将 Google Auth Library 用于 Node.js。

您可能需要在 Node.js 服务器上向 Google 进行身份验证,以代表用户执行服务器端操作,例如使用用户的凭证调用 Atlas Function。

Apple身份验证提供程序允许您通过“使用 Apple 登录”对用户进行身份验证。

注意

启用 Apple 身份验证提供者

要对 Apple 用户进行身份验证,必须配置 Apple 身份验证提供者。

您可以使用官方 Sign in with Apple JS SDK 来处理来自客户端应用程序的用户身份验证和重定向流。完成身份验证后,Apple JS SDK 会返回一个 ID 令牌,您可以将其发送到您的 Node.js 应用,并使用它来结束用户登录到您应用的流程。

// Get the ID token from the Apple SDK
const { id_token } = await AppleID.auth.signIn();
// Define credentials with the ID token from the Apple SDK
const credentials = Realm.Credentials.apple(id_token);
// Log the user in to your app
const user = await app.logIn(credentials);

提示

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

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

注意

初始登录需要网络连接

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

// Log user into your App Services App.
// On first login, the user must have a network connection.
const getUser = async () => {
// If the device has no cached user credentials, log in.
if (!app.currentUser) {
const credentials = Realm.Credentials.anonymous();
await app.logIn(credentials);
}
// If the app is offline, but credentials are
// cached, return existing user.
return app.currentUser!;
};

要了解如何在同步配置中使用已缓存的用户并在离线时访问 Realm,请阅读离线时打开已同步的 Realm 文档。

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

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

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

// Gets a valid user access token to authenticate requests
async function getValidAccessToken(user) {
// An already logged in user's access token might be stale. To
// guarantee that the token is valid, refresh it if necessary.
await user.refreshCustomData();
return user.accessToken;
}
// Gets a valid user access token to authenticate requests
async function getValidAccessToken(user: Realm.User) {
// An already logged in user's access token might be stale. To
// guarantee that the token is valid, refresh it if necessary.
await user.refreshCustomData();
return user.accessToken;
}

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

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

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

要登出任何用户,请在相应的用户实例上调用 User.logOut()

警告

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

// Log out the current user
await app.currentUser?.logOut();

后退

创建和删除用户