パスワードでのIdentifier Firstログインを構築する

Before you start

以下が必要です。

  • ユニバーサルログインが構成されたAuth0開発テナント。

  • カスタムドメイン構成のアプリケーション。

  • ローカルホスト上で動作する開発用アプリまたはサンプルアプリ(Reactサンプルアプリなど)

  • Identifier First認証が有効になっている

  • パスワードを使用するデータベース接続

このガイドの終わりには、カスタマイズしたログインID画面とログインパスワード画面のあるIdentity Firstフローが完成します。詳細については、「使用の開始ガイド」をお読みの上で、SDKリファレンスガイド」を参照してください。

セットアップする

Auth0 DashboardユニバーサルログインIdentifier First認証、パスワードを使用するデータベース接続をセットアップします。

シングルページアプリケーションを実行して、カスタムログイン画面を構築します。高度なカスタマイズインターフェイスのコンテキストを理解するには、Auth0が提供するボイラープレートアプリをクローンしてください:git clone https://github.com/auth0/auth0-acul-react-boilerplate

ACUL SDKをインストールします。Reactのボイラープレートをクローンしたら、ディレクトリをauth0-acul-react-boilerplateに変更して、SDKをインストールします。

// open the directory where you git clone the boilerplate
cd auth0-acul-react-boilerplate && npm i
// Install the ACUL JS SDK
npm install @auth0/auth0-acul-js

Was this helpful?

/

1. login-id画面を構築する

Login ID

以下は完全な画面の例です。

/

import { ChangeEvent } from "react";
import { LoginId as ScreenProvider } from "@auth0/auth0-acul-js";

// UI Components
import { Label } from "@/components/ui/label";
import { Input } from "@/components/ui/input";
import { Button } from "@/components/ui/button";
import { Text } from "@/components/ui/text";
import { Link } from "@/components/ui/link";
import {
  CardHeader,
  CardTitle,
  CardDescription,
  CardContent,
} from "@/components/ui/card";

export default function LoginId() {
  // Initialize the SDK for this screen
  const screenProvider = new ScreenProvider();

  // Handle the submit action
  const formSubmitHandler = (event: ChangeEvent<HTMLFormElement>) => {
    event.preventDefault();

    // grab the value from the form
    const identifierInput = event.target.querySelector(
      "input#identifier"
    ) as HTMLInputElement;

    // Call the SDK
    screenProvider.login({ username: identifierInput?.value });
  };

  // Render the form
  return (
    <form noValidate onSubmit={formSubmitHandler}>
      <CardHeader>
        <CardTitle className="mb-2 text-3xl font-medium text-center">
          {screenProvider.screen.texts?.title ?? "Welcome"}
        </CardTitle>
        <CardDescription className="mb-8 text-center">
          {screenProvider.screen.texts?.description ?? "Login to continue"}
        </CardDescription>
      </CardHeader>
      <CardContent>
        <div className="mb-2 space-y-2">
          <Label htmlFor="identifier">
            {screenProvider.screen.texts?.emailPlaceholder ??
              "Enter your email"}
          </Label>
          <Input
            type="text"
            id="identifier"
            name="identifier"
            defaultValue={
              screenProvider.screen.data?.username ??
              screenProvider.untrustedData.submittedFormData?.username
            }
          />
        </div>
        <Button type="submit" className="w-full">
          {screenProvider.screen.texts?.buttonText ?? "Continue"}
        </Button>
        <Text className="mb-2">
          {screenProvider.screen.texts?.footerText ??
            "Don't have an account yet?"}
          <Link className="ml-1" href={screenProvider.screen.signupLink ?? "#"}>
            {screenProvider.screen.texts?.footerLinkText ??
              "Create your account"}
          </Link>
        </Text>
        <Text>
          Need Help?
          <Link
            className="ml-1"
            href={screenProvider.screen.resetPasswordLink ?? "#"}
          >
            {screenProvider.screen.texts?.forgottenPasswordText ??
              "Forgot your Password?"}
          </Link>
        </Text>
      </CardContent>
    </form>
  );
}

Was this helpful?

/

SDKをインポートして初期化する

auth0-acul-react-boilerplate/srcフォルダー内に「screens」という名前のフォルダーと「Login.tsx」という名前のファイルを作成します。SDKをインポートして、Reactコンポーネント内で画面にSDKを初期化します。

import { LoginId as ScreenProvider } from "@auth0/auth0-acul-js";

export default function LoginId() {
  // Initialize the SDK for this screen
  const screenProvider = new ScreenProvider();
  ...
}

Was this helpful?

/

SDKで画面のプロパティやメソッドにアクセスする

SDKを使用すると、画面のプロパティやメソッドにアクセスできます。Auth0 ACUL JS SDKにはデータにアクセスするためのプロパティとメソッドがあります。

コンテキストデータの詳細については、「ユニバーサルログインのコンテキストデータ」をお読みください。

<CardContent>
    <div className="mb-2 space-y-2">
      <Label htmlFor="identifier">
        {screenProvider.screen.texts?.emailPlaceholder ??
          "Enter your email"}
      </Label>
      <Input
        type="text"
        id="identifier"
        name="identifier"
        defaultValue={
          screenProvider.screen.data?.username ??
          screenProvider.untrustedData.submittedFormData?.username
        }
      />
    </div>
    <Button type="submit" className="w-full">
      {screenProvider.screen.texts?.buttonText ?? "Continue"}
    </Button>
    ...
  </CardContent>
</form>

Was this helpful?

/

送信アクションを呼び出す

SDKを使用して、画面で捉えたデータをサーバーに送信します。サーバーはこのデータを処理し、フローにある次の手順にユーザーを進めます。エラーがあれば画面を再度読み込んで、ユーザーにエラーのある箇所を示します。エラーはSDKからアクセスされます。

const formSubmitHandler = (event: ChangeEvent<HTMLFormElement>) => {
    event.preventDefault();

    // grab the value from the form
    const identifierInput = event.target.querySelector(
      "input#identifier"
    ) as HTMLInputElement;

    // Call the SDK
    screenProvider.loginid({ username: identifierInput?.value });
  };

Was this helpful?

/

2. login-password画面を構築する

Login Password

以下は完全な画面の例です。

/

import { ChangeEvent } from "react";
import { LoginPassword as ScreenProvider } from "@auth0/auth0-acul-js";

// UI Components
import { Label } from "@/components/ui/label";
import { Input } from "@/components/ui/input";
import { Button } from "@/components/ui/button";
import { Text } from "@/components/ui/text";
import { Link } from "@/components/ui/link";
import {
  CardHeader,
  CardTitle,
  CardDescription,
  CardContent,
} from "@/components/ui/card";

export default function LoginPassword() {
  // Initialize the SDK for this screen
  const screenProvider = new ScreenProvider();

  // Handle the submit action
  const formSubmitHandler = (event: ChangeEvent<HTMLFormElement>) => {
    event.preventDefault();

    // grab the values from the form
    const identifierInput = event.target.querySelector(
      "input#identifier"
    ) as HTMLInputElement;
    const passwordInput = event.target.querySelector(
      "input#password"
    ) as HTMLInputElement;

    // Call the SDK
    screenProvider.login({
      username: identifierInput?.value,
      password: passwordInput?.value,
    });
  };

  // Render the form
  return (
    <form noValidate onSubmit={formSubmitHandler}>
      <CardHeader>
        <CardTitle className="mb-2 text-3xl font-medium text-center">
          {screenProvider.screen.texts?.title ?? "Enter Your Password"}
        </CardTitle>
        <CardDescription className="mb-8 text-center">
          {screenProvider.screen.texts?.description ??
            "Enter your password to continue"}
        </CardDescription>
      </CardHeader>
      <CardContent>
        <Text className="mb-4 text-large">
          <span className="inline-block">
            Log in as
            <span className="inline-block ml-1 font-bold">
              {screenProvider.screen.data?.username}.
            </span>
          </span>
          <Link
            href={screenProvider.screen.editIdentifierLink ?? "#"}
            className="ml-2"
          >
            {screenProvider.screen.texts?.editEmailText ?? "Edit Email"}
          </Link>
        </Text>
        <Input
          type="hidden"
          name="identifier"
          id="identifier"
          value={screenProvider.screen.data?.username}
        />
        <div className="mb-2 space-y-2">
          <Label htmlFor="password">
            {screenProvider.screen.texts?.passwordPlaceholder ?? "Password"}
          </Label>
          <Input type="password" id="password" name="password" />
        </div>
        <Button type="submit" className="w-full">
          {screenProvider.screen.texts?.buttonText ?? "Continue"}
        </Button>
        <Text>
          Need Help?
          <Link
            href={screenProvider.screen.resetPasswordLink ?? "#"}
            className="ml-1"
          >
            {screenProvider.screen.texts?.forgottenPasswordText ??
              "Forgot your Password?"}
          </Link>
        </Text>
      </CardContent>
    </form>
  );
}

Was this helpful?

/

SDKをインポートして初期化する

auth0-acul-react-boilerplate/srcフォルダー内に「screens」という名前のフォルダーと「Login.tsx」という名前のファイルを作成します。SDKをインポートして、Reactコンポーネント内で画面にSDKを初期化します。

import { LoginPassword as ScreenProvider } from "@auth0/auth0-acul-js";

export default function LoginPassword() {
  // Initialize the SDK
  const [SDK] = useState(() => new ScreenProvider());\
  ...
  }

Was this helpful?

/

SDKで画面のプロパティやメソッドにアクセスする

SDKを使用すると、画面のプロパティやメソッドにアクセスできます。Auth0 ACUL JS SDKにはデータにアクセスするためのプロパティとメソッドがあります。

コンテキストデータの詳細については、「ユニバーサルログインのコンテキストデータ」をお読みください。

<CardContent>
        <Text className="mb-4 text-large">
          <span className="inline-block">
            Log in as
            <span className="inline-block ml-1 font-bold">
              {screenProvider.screen.data?.username}.
            </span>
          </span>
          <Link
            href={screenProvider.screen.editIdentifierLink ?? "#"}
            className="ml-2"
          >
            {screenProvider.screen.texts?.editEmailText ?? "Edit Email"}
          </Link>
        </Text>
        <Input
          type="hidden"
          name="identifier"
          id="identifier"
          value={screenProvider.screen.data?.username}
        />
        <div className="mb-2 space-y-2">
          <Label htmlFor="password">
            {screenProvider.screen.texts?.passwordPlaceholder ?? "Password"}
          </Label>
          <Input type="password" id="password" name="password" />
        </div>
        <Button type="submit" className="w-full">
          {screenProvider.screen.texts?.buttonText ?? "Continue"}
        </Button>
...
      </CardContent>
    </form>

Was this helpful?

/

送信アクションを呼び出す

SDKを使用して、画面で捉えたデータをサーバーに送信します。サーバーはこのデータを処理し、フローにある次の手順にユーザーを進めます。エラーがあれば画面を再度読み込んで、ユーザーにエラーのある箇所を示します。エラーはSDKからアクセスされます。

const formSubmitHandler = (event: ChangeEvent<HTMLFormElement>) => {
    event.preventDefault();

    // grab the values from the form
    const identifierInput = event.target.querySelector(
      "input#identifier"
    ) as HTMLInputElement;
    const passwordInput = event.target.querySelector(
      "input#password"
    ) as HTMLInputElement;

    // Call the SDK
    screenProvider.login({
      username: identifierInput?.value,
      password: passwordInput?.value,
    });
  };

Was this helpful?

/

3. ACULにローカルアセットの使用を構成する

Auth0 CLI、Terraform、またはManagement APIを使用してACULを有効化します。構成可能な項目については、「ACUL画面を構成する」をお読みください。

プロジェクトのルートディレクトリにsettingsフォルダーを作成して、{SCREENNAME}.jsonファイルを格納します。

//settings.json
{
  "rendering_mode": "advanced",
  "context_configuration": [
    "screen.texts"
  ],
  "default_head_tags_disabled": false,
  "head_tags": [
    {
      "attributes": {
        "async": true,
        "defer": true,
        "integrity": [
          "ASSET_SHA"
        ],
        "src": "http://127.0.0.1:8080/index.js"
      },
      "tag": "script"
    },
    {
      "attributes": {
        "href": "http://127.0.0.1:8080/index.css",
        "rel": "stylesheet"
      },
      "tag": "link"
    }
  ]
}

Was this helpful?

/
 Auth0 CLIでACULを有効にするには以下を行います。

auth0 ul customize --rendering-mode advanced --prompt {SCREENNAME} --screen {SCREENNAME} --settings-file ./settings/{SCREENNAME}.json

Was this helpful?

/

ローカルサーバーで構成をテストする

ACULではアセットを公開URLでホストする必要があります。アセットをデプロイする前に、ローカルサーバーを実行してアセットをテストしてください。

npm run build

cd dist
npx serve -p 8080 // serve the assets on your local machine

Was this helpful?

/

4. アセットをデプロイしてテナント構成を更新する

ユニバーサルログインの高度なカスタマイズは、ViteやWebpackなどを含むすべてのModern Javascriptバンドルで動作します。詳細については、「高度なカスタマイズを運用にデプロイする」をお読みください。

テナントにACULをデプロイする詳細については、「ACUL画面を構成する」をお読みください。

関連コンテンツ

トピック 説明                               
ユニバーサルログインの高度なカスタマイズ 高度なカスタマイズの仕組みを説明します。
高度なカスタマイズの使用を開始する 高度なカスタマイズの入門ガイドです。
ユニバーサルログインの高度なカスタマイズ:画面 高度なカスタマイズに利用可能な画面のリストです。