Logto は、モダンなアプリや SaaS 製品向けに設計された Auth0 の代替です。 Cloud と オープンソース の両方のサービスを提供し、アイデンティティと管理 (IAM) システムを迅速に立ち上げるのに役立ちます。認証 (Authentication)、認可 (Authorization)、マルチテナント管理を すべて一つに まとめて楽しんでください。
Logto Cloud で無料の開発テナントから始めることをお勧めします。これにより、すべての機能を簡単に探索できます。
この記事では、iOS (Swift) と Logto を使用して、SendGrid サインイン体験(ユーザー認証 (Authentication))を迅速に構築する手順を説明します。
前提条件
- 稼働中の Logto インスタンス。紹介ページ をチェックして始めてください。
- iOS (Swift) の基本的な知識。
- 使用可能な SendGrid アカウント。
Logto にアプリケーションを作成する
Logto は OpenID Connect (OIDC) 認証 (Authentication) と OAuth 2.0 認可 (Authorization) に基づいています。これは、複数のアプリケーション間でのフェデレーテッドアイデンティティ管理をサポートし、一般的にシングルサインオン (SSO) と呼ばれます。
あなたの Native app アプリケーションを作成するには、次の手順に従ってください:
- Logto コンソール を開きます。「Get started」セクションで、「View all」リンクをクリックしてアプリケーションフレームワークのリストを開きます。あるいは、Logto Console > Applications に移動し、「Create application」ボタンをクリックします。
- 開いたモーダルで、左側のクイックフィルターチェックボックスを使用して、利用可能なすべての "Native app" フレームワークをフィルタリングするか、"Native app" セクションをクリックします。"iOS (Swift)" フレームワークカードをクリックして、アプリケーションの作成を開始します。
- アプリケーション名を入力します。例:「Bookstore」と入力し、「Create application」をクリックします。
🎉 タダーン!Logto で最初のアプリケーションを作成しました。詳細な統合ガイドを含むお祝いページが表示されます。ガイドに従って、アプリケーションでの体験を確認してください。
Logto SDK を統合する
Logto SDK を依存関係として追加する
Logto Swift SDK のサポートされている最小 iOS バージョンは iOS 13 です。
Logto Swift SDK には 2 つの主要バージョンがあります:
- v2:サインイン体験を
ASWebAuthenticationSession(システムブラウザ)で開きます。これによりパスキーサインインが可能になり、ブラウザセッションが共有されます。v2 ではネイティブソーシャルプラグインターゲットが削除されていますが、ソーシャルコネクターは引き続きブラウザ経由で動作します。ネイティブの WeChat や Alipay SDK 連携が必要な場合は v1 をご利用ください。 - v1:サインイン体験を埋め込み WebView で開きます。これはネイティブソーシャルプラグインターゲットに必要ですが、パスキーサインイン には対応していません(WebView はパスキーの基盤となる WebAuthn をサポートしていません)。
このガイドは両バージョンに対応しています。下記のタブでバージョンを選択してください。選択はガイド全体で同期されます。
Swift Package Manager で Logto SDK を依存関係として追加するには、以下の URL を使用してください。
https://github.com/logto-io/swift.git
Xcode 11 以降、Swift パッケージを直接インポート できます。追加ツールは不要です。
Xcode でパッケージバージョンを尋ねられたら、統合したいバージョンを選択してください:
- v2
- v1
バージョンには最新の v2 リリースを使用してください。最新の v2 バージョンは 2.0.0 です。
Package.swift を直接使用する場合:
// Logto Swift SDK を依存関係として追加
.package(url: "https://github.com/logto-io/swift.git", from: "2.0.0")
ネイティブソーシャルプラグインターゲットが必要な場合は、最新の v1 リリースを使用してください。最新の v1 バージョンは 1.2.0 です。
Package.swift を直接使用する場合:
// Logto Swift SDK を依存関係として追加
.package(url: "https://github.com/logto-io/swift.git", from: "1.2.0")
Carthage および CocoaPods には、技術的な理由により現時点では対応していません。
Carthage
Carthage は ビルドに xcodeproj ファイルが必要 です。今後回避策を検討します。
LogtoClient を初期化する
LogtoConfig オブジェクトを使用して LogtoClient インスタンスを作成することで、クライアントを初期化します。
import Logto
import LogtoClient
let config = try? LogtoConfig(
endpoint: "<your-logto-endpoint>", // 例: http://localhost:3001
appId: "<your-app-id>"
)
let client = LogtoClient(useConfig: config)
デフォルトでは、ID トークンやリフレッシュ トークンのような資格情報を Keychain に保存します。したがって、ユーザーは戻ってきたときに再度サインインする必要はありません。
この動作をオフにするには、usingPersistStorage を false に設定します:
let config = try? LogtoConfig(
// ...
usingPersistStorage: false
)
サインイン
詳細に入る前に、エンドユーザー体験の概要を簡単にご紹介します。サインインプロセスは次のようにシンプルにまとめられます:
- アプリがサインインメソッドを呼び出します。
- ユーザーは Logto のサインインページにリダイレクトされます。ネイティブアプリの場合は、システムブラウザが開かれます。
- ユーザーがサインインし、アプリ(リダイレクト URI として設定)に戻されます。
リダイレクトベースのサインインについて
- この認証 (Authentication) プロセスは OpenID Connect (OIDC) プロトコルに従い、Logto はユーザーのサインインを保護するために厳格なセキュリティ対策を講じています。
- 複数のアプリがある場合、同じアイデンティティプロバイダー (Logto) を使用できます。ユーザーがあるアプリにサインインすると、Logto は別のアプリにアクセスした際に自動的にサインインプロセスを完了します。
リダイレクトベースのサインインの理論と利点について詳しく知るには、Logto サインイン体験の説明を参照してください。
リダイレクト URI の設定
- v2
- v1
Logto コンソールのアプリケーション詳細ページに切り替えましょう。リダイレクト URI io.logto.app://callback を追加し、「変更を保存」をクリックします。

v2 では、サインイン体験は ASWebAuthenticationSession(システムブラウザ)で開かれ、リダイレクトは OS レベルのコールバックマッチングを通じてアプリに戻されます。io.logto.app://callback のようなカスタムスキームのリダイレクト URI を使う場合、アプリの Info.plist にはスキーム部分(io.logto.app)のみを登録し、Logto アプリケーションの Redirect URIs には完全なリダイレクト URI を追加してください。
Xcode でアプリのターゲットを開き、Info を選択し、URL Types を展開して、URL Schemes に io.logto.app を追加します。Info.plist を直接編集する場合は、以下を追加します:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>io.logto.app</string>
<key>CFBundleURLSchemes</key>
<array>
<string>io.logto.app</string>
</array>
</dict>
</array>
v2 のブラウザフローでは、LogtoClient.handle(url:) を呼び出す必要はありません。このプラグインハンドオフ API は埋め込み WebView フローとともに削除されました。
カスタムスキームの代わりに Universal Links を使う?
https://example.com/callback のような HTTPS リダイレクト URI も利用できます:
- アプリに Associated Domains 機能を追加します。
webcredentials:example.comを設定し、iOS 17.4 以降でASWebAuthenticationSessionが HTTPS コールバックをマッチできるようにします。- 同じ URL で認証セッション外でも Universal Link としてアプリを開きたい場合は、
applinks:example.comを設定し、ドメインとパスに有効なapple-app-site-associationファイルをホストします。 - Logto アプリケーションの Redirect URIs に HTTPS URI を追加します。
signInWithBrowserに同じ URI を渡します。
iOS 17.4 以降では、SDK は ASWebAuthenticationSession の HTTPS コールバックマッチング API を利用するため、HTTPS リダイレクトで自動的にセッションを完了・終了できます。古い iOS バージョンでは、認可リクエストで HTTPS リダイレクト URI を使えますが、Universal Link コールバックをアプリ側で処理しない限りセッションが自動で閉じない場合があります。古い iOS バージョンで自動完了が必要な場合は、互換性のためにカスタムスキームリダイレクトも残しておいてください。
Logto コンソールのアプリケーション詳細ページに切り替えましょう。リダイレクト URI io.logto://callback を追加し、「変更を保存」をクリックします。

iOS SDK の Redirect URI は内部利用のみです。コネクターから要求されるまで Custom URL Scheme を追加する 必要はありません。
サインインとサインアウト
.signInWithBrowser(redirectUri:) を呼び出す前に、Admin Console でリダイレクト URI
が正しく設定されていることを確認してください。 :::
- v2
- v1
v2 では、client.signOut(postLogoutRedirectUri:) を使うと完全なサインアウトが実行されます:ローカル認証情報のクリア、リフレッシュ トークン (Refresh token) の取り消し、システムブラウザでエンドセッションエンドポイントを開いて Logto セッションを終了します。その後、ブラウザはサインアウト後リダイレクト URI を通じてアプリに戻ります。利用前に Logto Console のアプリケーション詳細ページでサインアウト後リダイレクト URI io.logto.app://signed-out を追加し、「Save changes」をクリックしてください。サインアウト後リダイレクト URI にはサインイン時に登録したカスタムスキームを使えます。
SwiftUI アプリの例:
// コメントは翻訳済み
struct ContentView: View {
@State var isAuthenticated: Bool
private let redirectUri = "io.logto.app://callback"
private let postLogoutRedirectUri = "io.logto.app://signed-out"
init() {
isAuthenticated = client.isAuthenticated
}
var body: some View {
VStack {
if isAuthenticated {
Button("Sign Out") {
Task { [self] in
let error = await client.signOut(postLogoutRedirectUri: postLogoutRedirectUri)
if let error = error {
print(error)
return
}
isAuthenticated = false
}
}
} else {
Button("Sign In") {
Task { [self] in
do {
try await client.signInWithBrowser(redirectUri: redirectUri)
isAuthenticated = true
} catch let error as LogtoClientErrors.SignIn {
// サインイン中にエラーが発生
} catch {
// その他のエラー
}
}
}
}
}
}
}
- サインアウト後リダイレクト URI なしで
client.signOut()を呼ぶこともできます。この場合 Console 側の設定は不要です:ブラウザに Logto サインアウトページが表示され、ユーザーは手動で閉じてアプリに戻ります。 - UI コンテキストが利用できない場合は、
client.clearCredentials()でローカル認証情報のクリアとリフレッシュ トークン (Refresh token) の取り消しが可能です。ただし、この場合ブラウザ上の Logto セッションは残るため、次回のsignInWithBrowserでそのセッションを使ってサイレントサインインされる場合があります。
client.signInWithBrowser(redirectUri:) でユーザーのサインイン、client.signOut() でサインアウトができます。
SwiftUI アプリの例:
// コメントは翻訳済み
struct ContentView: View {
@State var isAuthenticated: Bool
init() {
isAuthenticated = client.isAuthenticated
}
var body: some View {
VStack {
if isAuthenticated {
Button("Sign Out") {
Task { [self] in
await client.signOut()
isAuthenticated = false
}
}
} else {
Button("Sign In") {
Task { [self] in
do {
try await client.signInWithBrowser(redirectUri: "io.logto://callback")
isAuthenticated = true
} catch let error as LogtoClientErrors.SignIn {
// サインイン中にエラーが発生
} catch {
// その他のエラー
}
}
}
}
}
}
}
チェックポイント: アプリケーションをテストする
これで、アプリケーションをテストできます:
- アプリケーションを実行すると、サインインボタンが表示されます。
- サインインボタンをクリックすると、SDK がサインインプロセスを初期化し、Logto のサインインページにリダイレクトされます。
- サインインすると、アプリケーションに戻り、サインアウトボタンが表示されます。
- サインアウトボタンをクリックして、トークンストレージをクリアし、サインアウトします。
SendGrid コネクターを追加する
Email コネクターは、認証 (Authentication) のためにワンタイムパスワード (OTP) を送信するための方法です。これは、Email ベースの登録、サインイン、二要素認証 (2FA)、アカウント回復を含むパスワードレス認証 (Authentication) をサポートするために Email address の確認を可能にします。 Logto の Email コネクターを使用すると、数分でこれを設定できます。
Email コネクターを追加するには、次の手順に従ってください:
- Console > Connector > Email and SMS connectors に移動します。
- 新しい Email コネクターを追加するには、「Set up」ボタンをクリックし、「SendGrid」を選択します。
- 選択したプロバイダーの README ドキュメントを確認します。
- 「Parameter Configuration」セクションで設定フィールドを完了します。
- JSON エディターを使用して Email テンプレートをカスタマイズします。
- Email address に確認コードを送信して設定をテストします。
インプレースコネクターガイドに従っている場合は、次のセクションをスキップできます。
SendGrid email connector を設定する
SendGrid アカウントの登録
SendGrid のウェブサイト で新しいアカウントを作成してください。すでにアカウントをお持ちの場合は、このステップをスキップできます。
送信者の認証
SendGrid コンソールページ にアクセスし、SendGrid アカウントでサインインします。
送信者とは、認証コードメールの送信元アドレスを示します。SendGrid のメールサーバー経由でメールを送信するには、少なくとも 1 つの送信者を認証する必要があります。
SendGrid コンソールページ から、サイドバーの「Settings」→「Sender Authentication」へ進みます。
ドメイン認証 (Domain 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 が必要です。
Create API Key プロセスが完了すると、API キーが画面に表示されます。この API キーはこのタイミングでしか確認できないため、安全な場所に保存してください。
コネクターの設定
「API キーの作成」セクションで作成した API キーを apiKey フィールドに入力します。
送信者の From Address と Nickname を fromEmail および fromName フィールドに入力します。送信者の詳細は "Sender Management" ページ で確認できます。fromName は任意項目ですので、省略可能です。
用途に応じて複数の SendGrid メールコネクターテンプレートを追加できます。以下は単一テンプレートを追加する例です:
- メールのタイトルとなる
subjectフィールドを入力します。 - 任意の文字列内容を
contentフィールドに入力します。ランダム認証コード用の{{code}}プレースホルダーを忘れずに残してください。 - 用途に応じて
usageTypeフィールドにRegister、SignIn、ForgotPassword、Genericのいずれかを入力します。 - 内容の種類に応じて
typeフィールドにtext/plainまたはtext/htmlを入力します。
すべてのユーザーフローを有効にするには、Register、SignIn、ForgotPassword、Generic の 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」前に設定が機能するかどうかを確認できます。
以上です。サインアップ / サインインでコネクターを有効化 するのを忘れずに。
設定タイプ
| 名前 | 型 |
|---|---|
| apiKey | string |
| fromEmail | string |
| fromName | string (OPTIONAL) |
| templates | Template[] |
| テンプレートプロパティ | 型 | 列挙値 |
|---|---|---|
| subject | string | N/A |
| content | string | N/A |
| usageType | enum string | 'Register' / 'SignIn' / 'ForgotPassword' / 'Generic' |
| type | enum string | 'text/plain' / 'text/html' |
設定を保存する
Logto コネクター設定エリアで必要な値をすべて記入したことを確認してください。「保存して完了」または「変更を保存」をクリックすると、SendGrid コネクターが利用可能になります。
サインイン体験で SendGrid コネクターを有効にする
コネクターを正常に作成したら、電話番号ベースのパスワードレスログインと登録を有効にできます。
- コンソール > サインイン体験 > サインアップとサインイン に移動します。
- サインアップ方法を設定します(オプション):
- サインアップ識別子として "Email address" または "Email or phone number" を選択します。
- "Verify at sign-up" は強制的に有効化されます。登録時に "Create a password" を有効にすることもできます。
- サインイン方法を設定します:
- サインイン識別子の一つとして Email address を選択します。複数の利用可能な識別子(メール、電話番号、ユーザー名)を提供できます。
- 認証 (Authentication) 要素として "Verification code" および / または "Password" を選択します。
- "Save changes" をクリックし、"Live preview" でテストします。
OTP を使用した登録とログインに加えて、パスワードの回復や ベースのセキュリティ検証を有効にし、Email address をプロファイルにリンクすることもできます。詳細については、エンドユーザーフロー を参照してください。
テストと検証
iOS (Swift) アプリに戻ります。これで SendGrid を使用してサインインできるはずです。お楽しみください!
さらなる読み物
エンドユーザーフロー:Logto は、MFA やエンタープライズシングルサインオン (SSO) を含む即時使用可能な認証 (Authentication) フローを提供し、アカウント設定、セキュリティ検証、マルチテナント体験の柔軟な実装のための強力な API を備えています。
認可 (Authorization):認可 (Authorization) は、ユーザーが認証 (Authentication) された後に行えるアクションやアクセスできるリソースを定義します。ネイティブおよびシングルページアプリケーションの API を保護し、ロールベースのアクセス制御 (RBAC) を実装する方法を探ります。
組織 (Organizations):特にマルチテナント SaaS や B2B アプリで効果的な組織機能は、テナントの作成、メンバー管理、組織レベルの RBAC、およびジャストインタイムプロビジョニングを可能にします。
顧客 IAM シリーズ:顧客(または消費者)アイデンティティとアクセス管理に関する連続ブログ投稿で、101 から高度なトピックまでを網羅しています。