メインコンテンツまでスキップ
新しい友達のために:

Logto は、モダンなアプリや SaaS 製品向けに設計された Auth0 の代替です。 Cloudオープンソース の両方のサービスを提供し、アイデンティティと管理 (IAM) システムを迅速に立ち上げるのに役立ちます。認証 (Authentication)、認可 (Authorization)、マルチテナント管理を すべて一つに まとめて楽しんでください。

Logto Cloud で無料の開発テナントから始めることをお勧めします。これにより、すべての機能を簡単に探索できます。

この記事では、Chrome extensionLogto を使用して、SMTP サインイン体験(ユーザー認証 (Authentication))を迅速に構築する手順を説明します。

前提条件

  • 稼働中の Logto インスタンス。紹介ページ をチェックして始めてください。
  • Chrome extension の基本的な知識。
  • 使用可能な SMTP アカウント。

Logto にアプリケーションを作成する

Logto は OpenID Connect (OIDC) 認証 (Authentication) と OAuth 2.0 認可 (Authorization) に基づいています。これは、複数のアプリケーション間でのフェデレーテッドアイデンティティ管理をサポートし、一般的にシングルサインオン (SSO) と呼ばれます。

あなたの シングルページアプリケーション アプリケーションを作成するには、次の手順に従ってください:

  1. Logto コンソール を開きます。「Get started」セクションで、「View all」リンクをクリックしてアプリケーションフレームワークのリストを開きます。あるいは、Logto Console > Applications に移動し、「Create application」ボタンをクリックします。 Get started
  2. 開いたモーダルで、左側のクイックフィルターチェックボックスを使用して、利用可能なすべての "シングルページアプリケーション" フレームワークをフィルタリングするか、"シングルページアプリケーション" セクションをクリックします。"Chrome extension" フレームワークカードをクリックして、アプリケーションの作成を開始します。 Frameworks
  3. アプリケーション名を入力します。例:「Bookstore」と入力し、「Create application」をクリックします。

🎉 タダーン!Logto で最初のアプリケーションを作成しました。詳細な統合ガイドを含むお祝いページが表示されます。ガイドに従って、アプリケーションでの体験を確認してください。

Logto SDK を統合する

ヒント:
  • 以下のデモは Chrome v123.0.6312.87 (arm64) でテストされました。他のバージョンでも、SDK で使用されている chrome API をサポートしていれば動作するはずです。
  • サンプルプロジェクトは、私たちの GitHub リポジトリ で利用可能です。

インストール

npm i @logto/chrome-extension

認証 (Authentication) フロー

Chrome 拡張機能のポップアップに「サインイン」ボタンを配置したと仮定すると、認証 (Authentication) フローは次のようになります:

拡張機能内の他のインタラクティブなページについては、拡張機能ポップアップ の参加者をページ名に置き換えるだけです。このチュートリアルでは、ポップアップページに焦点を当てます。

リダイレクトベースのサインインについて

  1. この認証 (Authentication) プロセスは OpenID Connect (OIDC) プロトコルに従い、Logto はユーザーのサインインを保護するために厳格なセキュリティ対策を講じています。
  2. 複数のアプリがある場合、同じアイデンティティプロバイダー (Logto) を使用できます。ユーザーがあるアプリにサインインすると、Logto は別のアプリにアクセスした際に自動的にサインインプロセスを完了します。

リダイレクトベースのサインインの理論と利点について詳しく知るには、Logto サインイン体験の説明を参照してください。

manifest.json を更新する

Logto SDK は manifest.json に次の権限を必要とします:

manifest.json
{
"permissions": ["identity", "storage"],
"host_permissions": ["https://*.logto.app/*"]
}
  • permissions.identity: Chrome Identity API に必要で、サインインとサインアウトに使用されます。
  • permissions.storage: ユーザーのセッションを保存するために必要です。
  • host_permissions: Logto SDK が Logto API と通信するために必要です。
注記:

Logto Cloud でカスタムドメインを使用している場合は、host_permissions をドメインに合わせて更新する必要があります。

バックグラウンドスクリプト(サービスワーカー)を設定する

Chrome 拡張機能のバックグラウンドスクリプトで、Logto SDK を初期化します:

service-worker.js
import LogtoClient from '@logto/chrome-extension';

export const logtoClient = new LogtoClient({
endpoint: '<your-logto-endpoint>'
appId: '<your-logto-app-id>',
});

<your-logto-endpoint><your-logto-app-id> を実際の値に置き換えてください。これらの値は、Logto コンソールで作成したアプリケーションページで見つけることができます。

バックグラウンドスクリプトがない場合は、公式ガイド に従って作成できます。

備考:

なぜバックグラウンドスクリプトが必要なのか?

ポップアップやオプションページのような通常の拡張機能ページはバックグラウンドで実行できず、認証 (Authentication) プロセス中に閉じられる可能性があります。バックグラウンドスクリプトは、認証 (Authentication) プロセスが適切に処理されることを保証します。

次に、他の拡張機能ページからのメッセージをリッスンし、認証 (Authentication) プロセスを処理する必要があります:

service-worker.js
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
// 以下のコードでは、各アクションに対して `true` を返すため、`sendResponse` を呼び出して
// 送信者に通知する必要があります。ここでエラーを処理したり、他の方法で送信者に通知することもできます。

if (message.action === 'signIn') {
const redirectUri = chrome.identity.getRedirectURL('/callback');
logtoClient.signIn(redirectUri).finally(sendResponse);
return true;
}

if (message.action === 'signOut') {
const redirectUri = chrome.identity.getRedirectURL();
logtoClient.signOut(redirectUri).finally(sendResponse);
return true;
}

return false;
});

上記のコードでは、2 つのリダイレクト URI が使用されていることに気付くかもしれません。これらはどちらも chrome.identity.getRedirectURL によって作成され、認証 (Authentication) フローのためのリダイレクト URL を生成するための Chrome の組み込み API です。2 つの URI は次のようになります:

  • サインイン用:https://<extension-id>.chromiumapp.org/callback
  • サインアウト用:https://<extension-id>.chromiumapp.org/

これらの URI はアクセスできず、Chrome が認証 (Authentication) プロセスの特定のアクションをトリガーするためにのみ使用されます。

Logto アプリケーション設定を更新する

次に、作成したリダイレクト URI を許可するために Logto アプリケーション設定を更新する必要があります。

  1. Logto コンソールのアプリケーションページに移動します。
  2. 「リダイレクト URI」セクションで、URI を追加します:https://<extension-id>.chromiumapp.org/callback
  3. 「サインアウト後のリダイレクト URI」セクションで、URI を追加します:https://<extension-id>.chromiumapp.org/
  4. 「CORS 許可されたオリジン」セクションで、URI を追加します:chrome-extension://<extension-id>。Chrome 拡張機能の SDK は、このオリジンを使用して Logto API と通信します。
  5. 変更を保存 をクリックします。

<extension-id> を実際の拡張機能 ID に置き換えることを忘れないでください。拡張機能 ID は chrome://extensions ページで見つけることができます。

ポップアップにサインインとサインアウトボタンを追加する

もう少しです!ポップアップページにサインインとサインアウトボタン、およびその他の必要なロジックを追加しましょう。

popup.html ファイルで:

popup.html
<button id="sign-in">Sign in</button> <button id="sign-out">Sign out</button>

popup.js ファイルで(popup.jspopup.html に含まれていると仮定):

popup.js
document.getElementById('sign-in').addEventListener('click', async () => {
await chrome.runtime.sendMessage({ action: 'signIn' });
// サインインが完了(または失敗)したら、ここで UI を更新できます。
});

document.getElementById('sign-out').addEventListener('click', async () => {
await chrome.runtime.sendMessage({ action: 'signOut' });
// サインアウトが完了(または失敗)したら、ここで UI を更新できます。
});

チェックポイント:認証 (Authentication) フローをテストする

Chrome 拡張機能で認証 (Authentication) フローをテストできます:

  1. 拡張機能のポップアップを開きます。
  2. 「サインイン」ボタンをクリックします。
  3. Logto サインインページにリダイレクトされます。
  4. Logto アカウントでサインインします。
  5. Chrome に戻ります。

認証 (Authentication) 状態を確認する

Chrome は統一されたストレージ API を提供しているため、サインインとサインアウトフロー以外のすべての Logto SDK メソッドはポップアップページで直接使用できます。

popup.js で、バックグラウンドスクリプトで作成した LogtoClient インスタンスを再利用するか、同じ構成で新しいものを作成できます:

popup.js
import LogtoClient from '@logto/chrome-extension';

const logtoClient = new LogtoClient({
endpoint: '<your-logto-endpoint>'
appId: '<your-logto-app-id>',
});

// または、バックグラウンドスクリプトで作成した logtoClient インスタンスを再利用
import { logtoClient } from './service-worker.js';

次に、認証 (Authentication) 状態とユーザーのプロファイルを読み込む関数を作成できます:

popup.js
const loadAuthenticationState = async () => {
const isAuthenticated = await logtoClient.isAuthenticated();
// 認証 (Authentication) 状態に基づいて UI を更新

if (isAuthenticated) {
const user = await logtoClient.getIdTokenClaims(); // { sub: '...', email: '...', ... }
// ユーザーのプロファイルで UI を更新
}
};

loadAuthenticationState 関数をサインインとサインアウトのロジックと組み合わせることもできます:

popup.js
document.getElementById('sign-in').addEventListener('click', async () => {
await chrome.runtime.sendMessage({ action: 'signIn' });
await loadAuthenticationState();
});

document.getElementById('sign-out').addEventListener('click', async () => {
await chrome.runtime.sendMessage({ action: 'signOut' });
await loadAuthenticationState();
});

認証 (Authentication) 状態を持つポップアップページの例はこちらです:

ポップアップページ

その他の考慮事項

  • サービスワーカーバンドリング:Webpack や Rollup などのバンドラーを使用する場合、Node.js モジュールの不要なバンドリングを避けるために、ターゲットを browser または同様に明示的に設定する必要があります。
  • モジュール解決:Logto Chrome 拡張機能 SDK は ESM のみのモジュールです。

TypeScript、Rollup、その他の設定を含む完全な例については、サンプルプロジェクト を参照してください。

SMTP コネクターを追加する

Email コネクターは、認証 (Authentication) のためにワンタイムパスワード (OTP) を送信するための方法です。これは、Email ベースの登録、サインイン、二要素認証 (2FA)、アカウント回復を含むパスワードレス認証 (Authentication) をサポートするために メールアドレス の確認を可能にします。 Logto の Email コネクターを使用すると、数分でこれを設定できます。

Email コネクターを追加するには、次の手順に従ってください:

  1. Console > Connector > Email and SMS connectors に移動します。
  2. 新しい Email コネクターを追加するには、「Set up」ボタンをクリックし、「SMTP」を選択します。
  3. 選択したプロバイダーの README ドキュメントを確認します。
  4. 「Parameter Configuration」セクションで設定フィールドを完了します。
  5. JSON エディターを使用して Email テンプレートをカスタマイズします。
  6. メールアドレス に確認コードを送信して設定をテストします。
Connector tab
注記:

インプレースコネクターガイドに従っている場合は、次のセクションをスキップできます。

SMTP メールコネクター を設定する

SMTP コネクターの設定

SMTP は、特定のメールサービスプロバイダー専用の転送プロトコルではなく、すべてのプロバイダーで利用できます。

より理解を深めていただくために、以下のプロバイダーで SMTP コネクターを使用してメールを送信する方法のガイドを提供しています:

  • Gmail は世界で最も人気のあるメールサービスベンダーです。
  • Aliyun direct mail および SendGrid mail。これら 2 つのメールサービスプロバイダーについては、Logto チームが対応するコネクターを提供しているため、一般的なイメージを持っている方もいるでしょう。

以下の例を参考に、他のメールベンダーのセットアップも理解できることを願っています 🚀

Gmail 用の設定

Gmail で新しい Gmail アカウントを取得するか、既存のアカウントをお持ちの場合はそれを使用できます。

Gmail 公式記事 では、SMTP コネクターを介して Gmail を操作するために必要なプロパティ値の決定方法が示されています。

SendGrid SMTP API との統合

最初に、SendGrid アカウントをすでにお持ちであることを前提とします。まだの場合は、 SendGrid ウェブサイト で新しいアカウントを作成してください。

"Integrating with the SMTP API" でステップバイステップのガイドを確認できます。

開発者は "Sender Management"sender の詳細にアクセスできます。

Aliyun direct mail アカウントでの設定

Aliyun ウェブサイト にサインインしてください。アカウントをお持ちでない場合は新規登録してください。

SMTP を使用してメールを送信するガイド に従い、必要な設定や情報を取得するための「タスク」を完了してください。

SMTP サービスアドレスページ で、適切な SMTP サービスアドレスのホストとポート番号を選択できます。

「送信者アドレス」を確認するには、 DirectMail コンソール の左側ナビゲーションペインからアクセスできます。ここで Sender addressSMTP Password を確認できます。

注記:

前述のケースではシンプルにするため、サンプルテンプレートは 1 つのみ提供しています。他のユースケース用にテンプレートを追加してください。 "<" と ">" で囲まれた値は、ご自身の Gmail、SendGrid、または Aliyun アカウント設定に合わせて変更し、それ以外のフィールドはそのままにしてください。 テンプレートの内容に {{code}} をプレースホルダーとして追加すると、送信メール内でランダムな認証コードを表示できます。

SMTP コネクターのテスト

メールアドレスを入力し、「送信」をクリックして、設定が機能するかどうかを「保存して完了」前に確認できます。

以上です。 サインイン体験でコネクターを有効化 するのをお忘れなく。

設定タイプ

NameType
hoststring
portstring
fromEmailstring
templatesTemplate[]
Template PropertiesTypeEnum values
subjectstringN/A
contentstringN/A
usageTypeenum string'Register' / 'SignIn' / 'ForgotPassword' / 'Generic'
contentTypeenum string'text/plain' / 'text/html'

ユーザー名とパスワード認証オプション

NameTypeEnum values
userstringN/A
passstringN/A
typeenum string (OPTIONAL)'login'

OAuth2 認証オプション やその他の高度な設定も可能です。詳細は こちら をご覧ください。

すべての設定可能なパラメーターを含むサンプル設定例をテキストボックス内に記載しています。ご自身の設定に合わせてご利用ください。(設定内容はご自身で責任を持ってください。一部の値はデモ用であり、実際のユースケースに適合しない場合があります。)

設定を保存する

Logto コネクター設定エリアで必要な値をすべて記入したことを確認してください。「保存して完了」または「変更を保存」をクリックすると、SMTP コネクターが利用可能になります。

サインイン体験で SMTP コネクターを有効にする

コネクターを正常に作成したら、電話番号ベースのパスワードレスログインと登録を有効にできます。

  1. コンソール > サインイン体験 > サインアップとサインイン に移動します。
  2. サインアップ方法を設定します(オプション):
    1. サインアップ識別子として "メールアドレス" または "Email or phone number" を選択します。
    2. "Verify at sign-up" は強制的に有効化されます。登録時に "Create a password" を有効にすることもできます。
  3. サインイン方法を設定します:
    1. サインイン識別子の一つとして メールアドレス を選択します。複数の利用可能な識別子(メール、電話番号、ユーザー名)を提供できます。
    2. 認証 (Authentication) 要素として "Verification code" および / または "Password" を選択します。
  4. "Save changes" をクリックし、"Live preview" でテストします。
Sign-in Experience tab

OTP を使用した登録とログインに加えて、パスワードの回復や ベースのセキュリティ検証を有効にし、メールアドレス をプロファイルにリンクすることもできます。詳細については、エンドユーザーフロー を参照してください。

テストと検証

Chrome extension アプリに戻ります。これで SMTP を使用してサインインできるはずです。お楽しみください!

さらなる読み物

エンドユーザーフロー:Logto は、MFA やエンタープライズシングルサインオン (SSO) を含む即時使用可能な認証 (Authentication) フローを提供し、アカウント設定、セキュリティ検証、マルチテナント体験の柔軟な実装のための強力な API を備えています。

認可 (Authorization):認可 (Authorization) は、ユーザーが認証 (Authentication) された後に行えるアクションやアクセスできるリソースを定義します。ネイティブおよびシングルページアプリケーションの API を保護し、ロールベースのアクセス制御 (RBAC) を実装する方法を探ります。

組織 (Organizations):特にマルチテナント SaaS や B2B アプリで効果的な組織機能は、テナントの作成、メンバー管理、組織レベルの RBAC、およびジャストインタイムプロビジョニングを可能にします。

顧客 IAM シリーズ:顧客(または消費者)アイデンティティとアクセス管理に関する連続ブログ投稿で、101 から高度なトピックまでを網羅しています。