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

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

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

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

前提条件

  • 実行中の Logto インスタンス。始めるには 紹介ページ をご覧ください。
  • Flutter の基本的な知識。
  • 使用可能な SendGrid アカウント。

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. 開いたモーダルで、左側のクイックフィルターチェックボックスを使用して、すべての利用可能な "ネイティブアプリ" フレームワークをフィルタリングするか、"ネイティブアプリ" セクションをクリックします。"Flutter" フレームワークカードをクリックして、アプリケーションの作成を開始します。 Frameworks
  3. アプリケーション名を入力します。例:「Bookstore」と入力し、「Create application」をクリックします。

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

Logto SDK を統合する

ヒント:
  • SDK パッケージは pub.dev と Logto の GitHub リポジトリ で利用可能です。
  • サンプルプロジェクトは Flutter material を使用して構築されています。pub.dev で見つけることができます。
  • この SDK は iOS、Android、Web プラットフォームの Flutter アプリケーションと互換性があります。他のプラットフォームとの互換性はテストされていません。

インストール

logto_dart_sdk package を pub パッケージマネージャーを使用して直接インストールできます。 プロジェクトのルートで次のコマンドを実行してください:

flutter pub add logto_dart_sdk

または、次の内容を pubspec.yaml ファイルに追加してください:

dependencies:
logto_dart_sdk: ^3.0.0

その後、次を実行します:

flutter pub get

依存関係と構成

SDK バージョンの互換性

Logto SDK バージョンDart SDK バージョンDart 3.0 互換性
< 2.0.0>= 2.17.6 < 3.0.0false
>= 2.0.0 < 3.0.0>= 3.0.0true
>= 3.0.0>= 3.6.0true

flutter_secure_storage のセットアップ

この SDK は、クロスプラットフォームの永続的なセキュアトークンストレージを実装するために flutter_secure_storage を使用しています。

  • iOS では Keychain が使用されます。
  • Android では AES 暗号化が使用されます。

Android バージョンの設定

プロジェクトの android/app/build.gradle ファイルで android:minSdkVersion>= 18 に設定します。

build.gradle
  android {
...

defaultConfig {
...
minSdkVersion 18
...
}
}

Android での自動バックアップの無効化

デフォルトでは、Android は Google Drive にデータをバックアップします。これにより、例外 java.security.InvalidKeyException:Failed が発生する可能性があります。これを避けるために、

  1. 自動バックアップを無効にするには、アプリのマニフェストファイルに移動し、android:allowBackupandroid:fullBackupContent 属性を false に設定します。

    AndroidManifest.xml
    <manifest ... >
    ...
    <application
    android:allowBackup="false"
    android:fullBackupContent="false"
    ...
    >
    ...
    </application>
    </manifest>

  2. FlutterSecureStorage から sharedprefs を除外します。

    アプリのために android:fullBackupContent を無効にするのではなく保持する必要がある場合は、バックアップから sharedprefs ディレクトリを除外できます。 詳細は Android ドキュメント を参照してください。

    AndroidManifest.xml ファイルで、次の例のように <application> 要素に android:fullBackupContent 属性を追加します。この属性は、バックアップルールを含む XML ファイルを指します。

    AndroidManifest.xml
    <application ...
    android:fullBackupContent="@xml/backup_rules">
    </application>

    res/xml/ ディレクトリに @xml/backup_rules という名前の XML ファイルを作成します。このファイルに <include><exclude> 要素を使用してルールを追加します。次のサンプルは、device.xml を除くすべての共有設定をバックアップします:

    @xml/backup_rules
    <?xml version="1.0" encoding="utf-8"?>
    <full-backup-content>
    <exclude domain="sharedpref" path="FlutterSecureStorage"/>
    </full-backup-content>

詳細については、flutter_secure_storage を確認してください。

flutter_web_auth_2 のセットアップ

この SDK は、Logto でユーザーを認証 (Authentication) するために flutter_web_auth_2 を使用しています。このパッケージは、システム WebView またはブラウザを使用して Logto でユーザーを認証 (Authentication) するための簡単な方法を提供します。

このプラグインは、iOS 12+ および macOS 10.15+ では ASWebAuthenticationSession を、iOS 11 では SFAuthenticationSession を、Android では Chrome Custom Tabs を使用し、Web では新しいウィンドウを開きます。

  • iOS: 追加のセットアップは不要

  • Android: Android でコールバック URL を登録

    Logto のサインイン Web ページからコールバック URL をキャプチャするために、サインイン redirectUri を AndroidManifest.xml ファイルに登録する必要があります。

    AndroidManifest.xml
      <manifest>
    <application>
    <activity
    android:name="com.linusu.flutter_web_auth_2.CallbackActivity"
    android:exported="true">
    <intent-filter android:label="flutter_web_auth_2">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="YOUR_CALLBACK_URL_SCHEME_HERE" />
    </intent-filter>
    </activity>
    </application>
    </manifest>
  • Web ブラウザ: コールバック URL を処理するエンドポイントを作成

    Web プラットフォームを使用している場合、コールバック URL を処理し、postMessage API を使用してアプリケーションに返すエンドポイントを作成する必要があります。

    callback.html
    <!doctype html>
    <title>Authentication complete</title>
    <p>認証 (Authentication) が完了しました。自動的に閉じない場合は、ウィンドウを閉じてください。</p>
    <script>
    function postAuthenticationMessage() {
    const message = {
    'flutter-web-auth-2': window.location.href,
    };

    if (window.opener) {
    window.opener.postMessage(message, window.location.origin);
    window.close();
    } else if (window.parent && window.parent !== window) {
    window.parent.postMessage(message, window.location.origin);
    } else {
    localStorage.setItem('flutter-web-auth-2', window.location.href);
    window.close();
    }
    }

    postAuthenticationMessage();
    </script>

詳細については、flutter_web_auth_2 パッケージのセットアップガイドを確認してください。

統合

LogtoClient を初期化する

logto_dart_sdk パッケージをインポートし、アプリケーションのルートで LogtoClient インスタンスを初期化します。

lib/main.dart
import 'package:logto_dart_sdk/logto_dart_sdk.dart';
import 'package:http/http.dart' as http;

void main() async {
WidgetsFlutterBinding.ensureInitialized();
runApp(const MyApp());
}

class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);


Widget build(BuildContext context) {
return const MaterialApp(
title: 'Flutter Demo',
home: MyHomePage(title: 'Logto Demo Home Page'),
);
}
}

class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;


State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
late LogtoClient logtoClient;

void render() {
// state change
}

// LogtoConfig
final logtoConfig = const LogtoConfig(
endpoint: "<your-logto-endpoint>",
appId: "<your-app-id>"
);

void _init() {
logtoClient = LogtoClient(
config: logtoConfig,
httpClient: http.Client(), // Optional http client
);
render();
}


void initState() {
super.initState();
_init();
}

// ...
}

サインインを実装する

詳細に入る前に、エンドユーザーの体験について簡単に説明します。サインインプロセスは次のように簡略化できます:

  1. あなたのアプリがサインインメソッドを呼び出します。
  2. ユーザーは Logto のサインインページにリダイレクトされます。ネイティブアプリの場合、システムブラウザが開かれます。
  3. ユーザーがサインインし、あなたのアプリにリダイレクトされます(リダイレクト URI として設定されています)。

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

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

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


始める前に、アプリケーションのために管理コンソールでリダイレクト URI を追加する必要があります。

Logto コンソールのアプリケーション詳細ページに切り替えましょう。リダイレクト URI io.logto://callback を追加し、「変更を保存」をクリックします。

Logto コンソールのリダイレクト URI
  • iOS の場合、ASWebAuthenticationSession クラスがリダイレクト URI を登録しているかどうかに関係なくリダイレクト URI をリッスンするため、リダイレクト URI スキームは実際には重要ではありません。
  • Android の場合、リダイレクト URI スキームは AndroidManifest.xml ファイルに登録する必要があります。

リダイレクト URI が設定されたら、ページにサインインボタンを追加し、logtoClient.signIn API を呼び出して Logto サインインフローを開始します:

lib/main.dart
class _MyHomePageState extends State<MyHomePage> {
// ...
final redirectUri = 'io.logto://callback';


Widget build(BuildContext context) {
// ...

Widget signInButton = TextButton(
onPressed: () async {
await logtoClient.signIn(redirectUri);
render();
},
child: const Text('Sign In'),
);

return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
SelectableText('My Demo App'),
signInButton,
],
),
),
);
}
}

サインアウトを実装する

Logto コンソールのアプリケーション詳細ページに切り替えましょう。ポストサインアウトリダイレクト URI io.logto://callback を追加し、「変更を保存」をクリックします。

Logto コンソールのポストサインアウトリダイレクト URI

ポストサインアウトリダイレクト URI は、サインアウト後にリダイレクトする場所を示す OAuth 2.0 の概念です。

次に、メインページにサインアウトボタンを追加して、ユーザーがアプリケーションからサインアウトできるようにします。

lib/main.dart
class _MyHomePageState extends State<MyHomePage> {
// ...

final postSignOutRedirectUri = 'io.logto//home';


Widget build(BuildContext context) {
// ...

Widget signOutButton = TextButton(
onPressed: () async {
await logtoClient.signOut(postSignOutRedirectUri);
render();
},
child: const Text('Sign Out'),
);

return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
SelectableText('My Demo App'),
signInButton,
signOutButton,
],
),
),
);
}
}

認証 (Authentication) ステータスを処理する

Logto SDK は、認証 (Authentication) ステータスを確認するための非同期メソッドを提供します。このメソッドは logtoClient.isAuthenticated です。このメソッドは、ユーザーが認証 (Authentication) されている場合は true を、そうでない場合は false を返します。

この例では、認証 (Authentication) ステータスに基づいてサインインボタンとサインアウトボタンを条件付きでレンダリングします。次に、状態変更を処理するために Widget の render メソッドを更新しましょう:

lib/main.dart
class _MyHomePageState extends State<MyHomePage> {
// ...
bool? isAuthenticated = false;

void render() {
setState(() async {
isAuthenticated = await logtoClient.isAuthenticated;
});
}


Widget build(BuildContext context) {
// ...

return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
SelectableText('My Demo App'),
isAuthenticated == true ? signOutButton : signInButton,
],
),
),
);
}
}

チェックポイント: アプリケーションをテストする

これで、アプリケーションをテストできます:

  1. アプリケーションを実行すると、サインインボタンが表示されます。
  2. サインインボタンをクリックすると、SDK がサインインプロセスを初期化し、Logto のサインインページにリダイレクトされます。
  3. サインインすると、アプリケーションに戻り、サインアウトボタンが表示されます。
  4. サインアウトボタンをクリックして、トークンストレージをクリアし、サインアウトします。

SendGrid コネクターを追加する

Email コネクターは、認証 (Authentication) のためにワンタイムパスワード (OTP) を送信するための方法です。これにより、Email address の認証が可能になり、Email ベースの登録、サインイン、二要素認証 (2FA)、アカウントの復旧を含むパスワードレス認証 (Authentication) をサポートします。 Logto Email コネクターを使用すると、SendGridEmail プロバイダーとして簡単に接続できます。数分で設定を完了できます。

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

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

Connector tab

注記:

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

SendGrid email connector を設定する

SendGrid アカウントを登録する

SendGrid のウェブサイトで新しいアカウントを作成します。すでにアカウントをお持ちの場合は、このステップをスキップできます。

送信者を確認する

SendGrid コンソールページにアクセスし、SendGrid アカウントでサインインします。

送信者は、検証コードのメールが送信されるアドレスを示します。SendGrid メールサーバーを介してメールを送信するには、少なくとも 1 つの送信者を確認する必要があります。

SendGrid コンソールページから、「Settings」->「Sender Authentication」へサイドバーから移動します。

ドメイン認証は推奨されますが、必須ではありません。「Authenticate Your Domain」カードの「Get started」をクリックし、今後のガイドに従って送信者を SendGrid にリンクして確認します。

パネル内の「Verify a Single Sender」ボタンをクリックすると、送信者を作成するために必要な重要な情報を入力するフォームに焦点が当たります。ガイドに従ってこれらのフィールドをすべて入力し、「Create」ボタンを押します。

単一の送信者が作成されると、送信者のメールアドレスに検証リンク付きのメールが送信されます。メールボックスにアクセスし、検証メールを見つけ、メール内のリンクをクリックして単一の送信者を確認します。これで、SendGrid コネクターを使用して、確認した送信者を介してメールを送信できます。

API キーを作成する

SendGrid コンソールページから始め、「Settings」->「API Keys」へサイドバーから移動します。

API Keys ページの右上隅にある「Create API Key」をクリックします。API キーの名前を入力し、使用ケースに応じて「API Key Permission」をカスタマイズします。この API キーを使用してメールを送信する前に、グローバルな Full Access または Mail Send へのフルアクセスを持つ Restricted Access が必要です。

API キーは、Create API Key プロセスを完了するとすぐに画面に表示されます。この API キーは安全な場所に保存してください。これが唯一の表示機会です。

コネクターを設定する

「API キーを作成する」セクションで作成した API キーを apiKey フィールドに入力します。

送信者の From AddressNicknamefromEmailfromName フィールドに入力します。送信者の詳細は "Sender Management" ページで確認できます。fromName はオプションなので、入力をスキップできます。

異なるケースに対して複数の SendGrid メールコネクターテンプレートを追加できます。以下は単一のテンプレートを追加する例です:

  • メールのタイトルとして機能する subject フィールドを入力します。
  • 任意の文字列型の内容で content フィールドを入力します。ランダムな検証コードのために {{code}} プレースホルダーを忘れずに残してください。
  • usageType フィールドを RegisterSignInForgotPasswordGeneric のいずれかで入力し、異なる使用ケースに対応します。
  • type フィールドを text/plain または text/html のいずれかで入力し、異なるタイプのコンテンツに対応します。

完全なユーザーフローを有効にするためには、RegisterSignInForgotPasswordGeneric の usageType を持つテンプレートが必要です。

以下は SendGrid コネクターテンプレート JSON の例です。

[
{
"subject": "<register-template-subject>",
"content": "<Logto: Your verification code is {{code}}. (register template)>",
"usageType": "Register",
"type": "text/plain",
},
{
"subject": "<sign-in-template-subject>",
"content": "<Logto: Your verification code is {{code}}. (sign-in template)>",
"usageType": "SignIn",
"type": "text/plain",
},
{
"subject": "<forgot-password-template-subject>",
"content": "<Logto: Your verification code is {{code}}. (forgot-password template)>",
"usageType": "ForgotPassword",
"type": "text/plain",
},
{
"subject": "<generic-template-subject>",
"content": "<Logto: Your verification code is {{code}}. (generic template)>",
"usageType": "Generic",
"type": "text/plain",
},
]

SendGrid メールコネクターをテストする

メールアドレスを入力し、「Send」をクリックして、設定が「Save and Done」前に機能するかどうかを確認できます。

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

設定タイプ

名前タイプ
apiKeystring
fromEmailstring
fromNamestring (OPTIONAL)
templatesTemplate[]
テンプレートプロパティタイプ列挙値
subjectstringN/A
contentstringN/A
usageTypeenum string'Register' | 'SignIn' | 'ForgotPassword' | 'Generic'
typeenum string'text/plain' | 'text/html'

設定を保存する

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

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

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

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

サインイン体験タブ

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

テストと検証

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

さらなる読み物

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

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

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

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