Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

ユーザーの認証 - Node.js SDK

項目一覧

  • ログイン
  • ユーザー セッション
  • 匿名ユーザー
  • メール/パスワード ユーザー
  • API キー ユーザー
  • カスタムJSON web tokenユーザー
  • カスタム関数ユーザー
  • Facebook ユーザー
  • Google ユーザー
  • Apple ユーザー
  • オフライン ログイン
  • ユーザー アクセス トークンを取得する
  • リフレッシュ トークンの有効期限
  • ユーザーのログアウト

Realm は、有効になっている任意の認証プロバイダーを使用してアプリにユーザーを認証するための API を提供します。 Credentialsオブジェクトをインスタンス化し、それをapp.login()メソッドに渡してユーザーのログインを認証し、 Userオブジェクトを作成します。

Atlas App Services は、アクセス トークンとリフレッシュ トークンを使用してセッションを管理します。 クライアント SDK は、トークンを管理するためのロジックを提供し、そのトークンにリクエストを提供します。

Tip

以下も参照してください。

ユーザー セッション

匿名プロバイダーを使用すると、ユーザーは関連情報を持たない一時アカウントでアプリケーションにログインできます。

ログインするには、匿名の認証情報を作成し、それを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 token認証プロバイダーを使用すると、 JSON web tokenを返す任意の認証システムを使用してユーザー認証を処理できます。

ログインするには、外部システムからJSON web tokenを使用してカスタムJSON web token認証情報を作成し、それを 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 認証プロバイダを設定する必要があります。 Node.js SDK で Google 認証プロバイダーを使用するには、OpenID Connect を有効にする必要があります。

アプリ構成 でアプリを Google ユーザー認証用に設定するには、次の手順に従います。

  1. Google Cloud Platform コンソール で 、OAuth2 を作成します。0「Web アプリケーション」タイプのクライアント ID。

  2. そのクライアント ID と関連付けられたクライアントシークレットを使用するようにバックエンド アプリを構成します。

  3. バックエンドで OpenID Connect を有効にします。

Node.js の公式 Google 認証ライブラリを 使用 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() メソッドを使用して、クエリstringにアクセス コードを含む 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 ルーティング用の と Node.js 用の Google Auth ライブラリ。

Node.js サーバーで Google と認証して、ユーザーの認証情報を使用して Atlas Function を呼び出すなど、ユーザーに代わってサーバーサイドの操作を実行することが必要な場合があります。

Apple認証プロバイダーは、Apple でサインインを通じてユーザーを認証することを可能にします。

注意

Apple 認証プロバイダーを有効にする

Sign in with AppleJavaScript SDK を 使用できます ユーザー認証とクライアント アプリケーションからのリダイレクト フローを処理します。認証が行われると、Apple JavaScript 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);

Tip

Login failedというエラーが発生した場合は、 のtoken contains an invalid number of segments UTF-8string でエンコードされたJSON web token バージョンを渡していることを確認してください。

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を開くDocsをお読みください。

ユーザーがログインすると、Atlas App Services はユーザー用のアクセス トークンを作成し、アプリへのアクセスを許可します。 Realm SDK はアクセス トークンを自動的に管理し、有効期限が切れると更新し、リクエストごとに現在のユーザーの有効なアクセス トークンを含めます。 Realm はリフレッシュ トークンを自動的に更新しません。 リフレッシュ トークンの有効期限が切れると、ユーザーは再度ログインする必要があります。

SDK 外でリクエストを送信する場合は、リクエストごとにユーザーのアクセス トークンを含め、有効期限が切れたときにトークンを手動で更新する必要があります。

次の例のように、 Realm.Userオブジェクトから SDK 内のログイン ユーザーのアクセス トークンにアクセスして更新できます。

// 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();

戻る

ユーザーの作成と削除