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

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

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

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

前提条件

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

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

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

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

  1. Logto コンソール を開きます。「Get started」セクションで、「View all」リンクをクリックしてアプリケーションフレームワークのリストを開きます。あるいは、Logto Console > Applications に移動し、「Create application」ボタンをクリックします。 Get started
  2. 開いたモーダルで、左側のクイックフィルターチェックボックスを使用して、利用可能なすべての "Native app" フレームワークをフィルタリングするか、"Native app" セクションをクリックします。"iOS (Swift)" フレームワークカードをクリックして、アプリケーションの作成を開始します。 Frameworks
  3. アプリケーション名を入力します。例:「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 リリースを使用してください。最新の v2 バージョンは 2.0.0 です。

Package.swift を直接使用する場合:

Package.swift
// Logto Swift SDK を依存関係として追加
.package(url: "https://github.com/logto-io/swift.git", from: "2.0.0")

Carthage および CocoaPods には、技術的な理由により現時点では対応していません。

Carthage

Carthage は ビルドに xcodeproj ファイルが必要 です。今後回避策を検討します。

CocoaPods

CocoaPods は ローカル依存関係 およびモノレポに対応していないため、このリポジトリ用の .podspec を作成するのは困難です。

LogtoClient を初期化する

LogtoConfig オブジェクトを使用して LogtoClient インスタンスを作成することで、クライアントを初期化します。

ContentView.swift
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 に保存します。したがって、ユーザーは戻ってきたときに再度サインインする必要はありません。

この動作をオフにするには、usingPersistStoragefalse に設定します:

let config = try? LogtoConfig(
// ...
usingPersistStorage: false
)

サインイン

詳細に入る前に、エンドユーザー体験の概要を簡単にご紹介します。サインインプロセスは次のようにシンプルにまとめられます:

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

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

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

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


リダイレクト URI の設定

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

Logto コンソールのリダイレクト URI

v2 では、サインイン体験は ASWebAuthenticationSession(システムブラウザ)で開かれ、リダイレクトは OS レベルのコールバックマッチングを通じてアプリに戻されます。io.logto.app://callback のようなカスタムスキームのリダイレクト URI を使う場合、アプリの Info.plist にはスキーム部分(io.logto.app)のみを登録し、Logto アプリケーションの Redirect URIs には完全なリダイレクト URI を追加してください。

Xcode でアプリのターゲットを開き、Info を選択し、URL Types を展開して、URL Schemesio.logto.app を追加します。Info.plist を直接編集する場合は、以下を追加します:

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 フローとともに削除されました。

https://example.com/callback のような HTTPS リダイレクト URI も利用できます:

  1. アプリに Associated Domains 機能を追加します。
  2. webcredentials:example.com を設定し、iOS 17.4 以降で ASWebAuthenticationSession が HTTPS コールバックをマッチできるようにします。
  3. 同じ URL で認証セッション外でも Universal Link としてアプリを開きたい場合は、applinks:example.com を設定し、ドメインとパスに有効な apple-app-site-association ファイルをホストします。
  4. Logto アプリケーションの Redirect URIs に HTTPS URI を追加します。
  5. signInWithBrowser に同じ URI を渡します。

iOS 17.4 以降では、SDK は ASWebAuthenticationSession の HTTPS コールバックマッチング API を利用するため、HTTPS リダイレクトで自動的にセッションを完了・終了できます。古い iOS バージョンでは、認可リクエストで HTTPS リダイレクト URI を使えますが、Universal Link コールバックをアプリ側で処理しない限りセッションが自動で閉じない場合があります。古い iOS バージョンで自動完了が必要な場合は、互換性のためにカスタムスキームリダイレクトも残しておいてください。

サインインとサインアウト

注記:

.signInWithBrowser(redirectUri:) を呼び出す前に、Admin Console でリダイレクト URI が正しく設定されていることを確認してください。 :::

v2 では、client.signOut(postLogoutRedirectUri:) を使うと完全なサインアウトが実行されます:ローカル認証情報のクリア、リフレッシュ トークン (Refresh token) の取り消し、システムブラウザでエンドセッションエンドポイントを開いて Logto セッションを終了します。その後、ブラウザはサインアウト後リダイレクト URI を通じてアプリに戻ります。利用前に Logto Console のアプリケーション詳細ページでサインアウト後リダイレクト URI io.logto.app://signed-out を追加し、「Save changes」をクリックしてください。サインアウト後リダイレクト URI にはサインイン時に登録したカスタムスキームを使えます。

SwiftUI アプリの例:

ContentView.swift
// コメントは翻訳済み
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 でそのセッションを使ってサイレントサインインされる場合があります。

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

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

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

Twilio コネクターを追加する

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

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

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

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

Twilio SMS コネクター を設定する

Twilio アカウントを登録する

Twilio で新しいアカウントを作成します。(すでにアカウントをお持ちの場合は次のステップに進んでください。)

送信者の電話番号を設定する

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

「Phone Numbers」->「Manage」->「Buy a number」から電話番号を購入します。

ヒント:

特定の国や地域で SMS サービスがサポートされていない場合があります。他の地域から番号を選択して回避してください。

有効な番号を取得したら、「Messaging」->「Services」に移動します。ボタンをクリックして新しいメッセージサービスを作成します。

フレンドリーなサービス名を付け、サービスの目的として Notify my users を選択します。次のステップでは、Sender Type として Phone Number を選択し、取得した電話番号を送信者としてこのサービスに追加します。

注記:

各電話番号は 1 つのメッセージングサービスにのみリンクできます。

アカウントの資格情報を取得する

コネクターを機能させるために API の資格情報が必要です。Twilio コンソールページ から始めましょう。

右上の「Account」メニューをクリックし、「API keys & tokens」ページに移動して Account SIDAuth token を取得します。

サイドバーから「Messaging」->「Services」設定ページに戻り、サービスの Sid を見つけます。

コネクター JSON を作成する

accountSIDauthTokenfromMessagingServiceSID フィールドに、対応するメッセージングサービスの Account SIDAuth tokenSid を入力します。

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

  • content フィールドには任意の文字列型の内容を入力します。ランダムな認証コードのために {{code}} プレースホルダーを忘れずに残してください。
  • usageType フィールドには、異なる使用ケースに応じて RegisterSignInForgotPasswordGeneric のいずれかを入力します。完全なユーザーフローを有効にするためには、RegisterSignInForgotPasswordGeneric の usageType を持つテンプレートが必要です。

Twilio SMS コネクターをテストする

電話番号を入力し、「Send」をクリックして、設定が「Save and Done」前に機能するかどうかを確認できます。

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

設定タイプ

名前タイプ
accountSIDstring
authTokenstring
fromMessagingServiceSIDstring
templatesTemplates[]
テンプレートプロパティタイプ列挙値
contentstringN/A
usageTypeenum string'Register' | 'SignIn' | 'ForgotPassword' | 'Generic'

設定を保存する

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

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

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

  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 を使用した登録とログインに加えて、パスワードの回復や ベースのセキュリティ検証を有効にし、電話番号 をプロファイルにリンクすることもできます。詳細については、エンドユーザーフロー を参照してください。

テストと検証

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

さらなる読み物

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

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

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

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