logologo
スタート
マニュアル
開発
プラグイン
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
スタート
マニュアル
開発
プラグイン
API
logologo

ユーザー認証

概要
認証器管理

認証タイプ

パスワード
SMS

OIDC

設定

サンプル

Google ログイン
Microsoft ログイン

SAML

設定

サンプル

Google ログイン
LDAP
CAS
企業微信
DingTalk
API キー

開発ガイド

拡張認証タイプ
API リファレンス

検証

概要

検証タイプ

SMS
TOTP 認証器

開発ガイド

拡張検証タイプ
拡張検証シナリオ
拡張SMSプロバイダー
API リファレンス
2要素認証 (2FA)
Next Page概要
TIP

このドキュメントはAIによって翻訳されました。不正確な情報については、英語版をご参照ください

#認証タイプの拡張

#概要

NocoBaseでは、必要に応じてユーザー認証タイプを拡張できます。ユーザー認証には主に2つのタイプがあります。1つは、パスワードログインやSMSログインのように、NocoBaseアプリケーション内でユーザーの身元を判断するタイプです。もう1つは、OIDCやSAMLなどの認証方法のように、サードパーティサービスがユーザーの身元を判断し、その結果をコールバックを通じてNocoBaseアプリケーションに通知するタイプです。NocoBaseにおけるこれら2つの異なる認証タイプのプロセスは、基本的に以下のようになります。

#サードパーティのコールバックに依存しない場合

  1. クライアントはNocoBase SDKを使用してログインインターフェース api.auth.signIn() を呼び出し、ログインインターフェース auth:signIn をリクエストします。この際、現在使用している認証器の識別子をリクエストヘッダー X-Authenticator を介してバックエンドに渡します。
  2. auth:signIn インターフェースは、リクエストヘッダー内の認証器識別子に基づいて、認証器に対応する認証タイプに転送され、その認証タイプに登録されている認証クラスの validate メソッドが関連するロジック処理を実行します。
  3. クライアントは auth:signIn インターフェースのレスポンスからユーザー情報と認証 token を取得し、token をLocal Storageに保存してログインを完了します。このステップはSDK内部で自動的に処理されます。

#サードパーティのコールバックに依存する場合

  1. クライアントは、自身で登録したインターフェース(例: auth:getAuthUrl)を通じてサードパーティのログインURLを取得し、プロトコルに従ってアプリケーション名や認証器の識別子などの情報を渡します。
  2. サードパーティのURLにリダイレクトしてログインを完了します。サードパーティサービスはNocoBaseアプリケーションのコールバックインターフェース(自身で登録する必要があります。例: auth:redirect)を呼び出し、認証結果を返します。この際、アプリケーション名や認証器の識別子などの情報も返されます。
  3. コールバックインターフェースメソッドは、パラメータを解析して認証器の識別子を取得し、AuthManager を介して対応する認証クラスを取得し、auth.signIn() メソッドを能動的に呼び出します。auth.signIn() メソッドは validate() メソッドを呼び出して認証ロジックを処理します。
  4. コールバックメソッドは認証 token を取得した後、302リダイレクトでフロントエンドページに戻り、URLパラメータに token と認証器の識別子(例: ?authenticator=xxx&token=yyy)を含めます。

次に、サーバーサイドインターフェースとクライアントサイドユーザーインターフェースの登録方法について説明します。

#サーバーサイド

#認証インターフェース

NocoBaseのコアは、認証タイプの拡張に関する登録と管理機能を提供しています。ログインプラグインのコアロジックを拡張するには、コアの抽象クラス Auth を継承し、対応する標準インターフェースを実装する必要があります。
完全なAPIリファレンスは Auth を参照してください。

import { Auth } from '@nocobase/auth';

class CustomAuth extends Auth {
  set user(user) {}
  get user() {}

  async check() {}
  async signIn() {}
}

コアは、ユーザー認証に関連する基本的なリソース操作も登録しています。

API説明
auth:checkユーザーのログイン状態を確認
auth:signInログイン
auth:signUp登録
auth:signOutログアウト

ほとんどの場合、拡張されたユーザー認証タイプは、既存のJWT認証ロジックを流用して、APIにアクセスするためのユーザー認証情報を生成できます。コアの BaseAuth クラスは Auth 抽象クラスの基本的な実装を提供しています。詳細は BaseAuth を参照してください。プラグインは BaseAuth クラスを直接継承することで、一部のロジックコードを再利用し、開発コストを削減できます。

import { BaseAuth } from '@nocobase/auth';

class CustomAuth extends BaseAuth {
  constructor(config: AuthConfig) {
    // ユーザーコレクションを設定
    const userCollection = config.ctx.db.getCollection('users');
    super({ ...config, userCollection });
  }

  // ユーザー認証ロジックを実装
  async validate() {}
}

#ユーザーデータ

ユーザー認証ロジックを実装する際、通常はユーザーデータの処理が伴います。NocoBaseアプリケーションでは、関連するテーブル(コレクション)はデフォルトで次のように定義されています。

コレクション役割プラグイン
usersメールアドレス、ニックネーム、パスワードなどのユーザー情報を保存ユーザープラグイン (@nocobase/plugin-users)
authenticators認証器(認証タイプエンティティ)情報、対応する認証タイプと設定を保存ユーザー認証プラグイン (@nocobase/plugin-auth)
usersAuthenticatorsユーザーと認証器を関連付け、対応する認証器の下にユーザー情報を保存ユーザー認証プラグイン (@nocobase/plugin-auth)

通常、拡張されたログイン方法では、users と usersAuthenticators を使用して関連するユーザーデータを保存するだけで十分です。特別な場合にのみ、独自の新しいコレクションを追加する必要があります。

usersAuthenticators の主なフィールドは次のとおりです。

フィールド説明
uuidこの認証方法におけるユーザーの一意の識別子(例: 電話番号、WeChat OpenIDなど)
metaJSONフィールド、その他保存する必要がある情報
userIdユーザーID
authenticator認証器名(一意の識別子)

ユーザーのクエリおよび作成操作のために、authenticators のデータモデル AuthModel にはいくつかのメソッドがカプセル化されており、CustomAuth クラス内で this.authenticator[メソッド名] を介して使用できます。完全なAPIリファレンスは AuthModel を参照してください。

import { AuthModel } from '@nocobase/plugin-auth';

class CustomAuth extends BaseAuth {
  async validate() {
    // ...
    const authenticator = this.authenticator as AuthModel;
    this.authenticator.findUser(); // ユーザーを検索
    this.authenticator.newUser(); // 新しいユーザーを作成
    this.authenticator.findOrCreateUser(); // ユーザーを検索または作成
    // ...
  }
}

#認証タイプの登録

拡張された認証方法は、認証管理モジュールに登録する必要があります。

class CustomAuthPlugin extends Plugin {
  async load() {
    this.app.authManager.registerTypes('custom-auth-type', {
      auth: CustomAuth,
    });
  }
}

#クライアントサイド

クライアントサイドのユーザーインターフェースは、ユーザー認証プラグインのクライアントが提供するインターフェース registerType を介して登録されます。

import AuthPlugin from '@nocobase/plugin-auth/client';

class CustomAuthPlugin extends Plugin {
  async load() {
    const auth = this.app.pm.get(AuthPlugin);
    auth.registerType('custom-auth-type', {
      components: {
        SignInForm, // ログインフォーム
        SignInButton, // ログイン(サードパーティ)ボタン。ログインフォームとどちらか一方を選択できます。
        SignUpForm, // 登録フォーム
        AdminSettingsForm, // 管理設定フォーム
      },
    });
  }
}

#ログインフォーム

複数の認証器に対応する認証タイプがログインフォームを登録している場合、それらはタブ形式で表示されます。タブのタイトルは、バックエンドで設定された認証器のタイトルになります。

#ログインボタン

通常はサードパーティのログインボタンとして使用されますが、実際には任意のコンポーネントにすることができます。

#登録フォーム

ログインページから登録ページへ遷移する必要がある場合は、ログインコンポーネント内でご自身で処理を行う必要があります。

#管理設定フォーム

上部には汎用的な認証器設定があり、下部には登録可能なカスタム設定フォームの部分が表示されます。

#APIリクエスト

クライアントサイドでユーザー認証関連のAPIリクエストを行うには、NocoBaseが提供するSDKを使用できます。

import { useAPIClient } from '@nocobase/client';

// コンポーネント内で使用
const api = useAPIClient();
api.auth.signIn(data, authenticator);

詳細なAPIリファレンスは @nocobase/sdk - Auth を参照してください。