メインコンテンツへスキップ

AI を使って Auth0 を統合する

Claude Code、Cursor、GitHub Copilot などの AI コーディングアシスタントを使用している場合は、agent skills を使って、数分で Auth0 認証を自動的に追加できます。インストール:
npx skills add auth0/agent-skills --skill auth0-quickstart --skill auth0-android
次に、AI アシスタントに次のように依頼します。
Add Auth0 authentication to my Android app
AI アシスタントが、Auth0 アプリケーションの作成、認証情報の取得、Auth0 Android SDK 依存関係の追加、manifest プレースホルダーの設定、ログイン/ログアウトフローの実装を自動で行います。agent skills の完全なドキュメント →

はじめに

1

新しい Android プロジェクトを作成する

このクイックスタート用に、新しい Android プロジェクトを作成します。Android Studio で:
  1. FileNewNew Project
  2. Phone and TabletEmpty Activity テンプレートを選択します
  3. 次のようにプロジェクトを設定します。
    • Name: Auth0-Android-Sample
    • Package name: com.auth0.samples.android
    • Language: Kotlin
    • Minimum SDK: API 24 (Android 7.0)
    • Build configuration language: Kotlin DSL
  4. Finish をクリックします
これにより、現在の Android 開発のベストプラクティスに沿った、Kotlin と Gradle Kotlin DSL を使用するモダンな Android アプリが作成されます。
2

Gradle で Auth0 SDK を追加する

Gradle を使用して、Auth0 Android SDK をプロジェクトに追加します。アプリ レベルの build.gradle.kts ファイルを更新します。
app/build.gradle.kts
dependencies {   
    // Auth0 SDK
    implementation("com.auth0.android:auth0:3.14.0")
}
アプリレベルのbuild.gradle.ktsにマニフェスト プレースホルダーを追加します。
app/build.gradle.kts
android {
    defaultConfig {
        // これらのマニフェストプレースホルダーを追加する
        manifestPlaceholders += mapOf(
            "auth0Domain" to "@string/com_auth0_domain", // 次のステップで設定する
            "auth0Scheme" to "https"
        )
    }
}

AndroidManifest.xml にインターネットのアクセス許可を追加します。
app/src/main/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>
Auth0 SDK は依存関係を自動的に解決し、トークンを安全に保存する機能を備えています。
3

Auth0アプリを設定する

次に、Auth0テナントで新しいアプリを作成し、その設定をAndroidプロジェクトに追加します。まず、app/src/main/res/values/strings.xml ファイルにプレースホルダー値を設定します。
app/src/main/res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="com_auth0_domain">{yourDomain}</string>
    <string name="com_auth0_client_id">YOUR_AUTH0_CLIENT_ID</string>
    <string name="com_auth0_scheme">https</string>
</resources>
  1. Auth0 Dashboardに移動します
  2. Applications > Applications > Create Application をクリックします
  3. ポップアップでアプリの名前を入力し、アプリの種類として Native を選択して Create をクリックします
  4. Application Details ページで Settings タブに切り替えます
  5. strings.xml ファイル内の {yourDomain}YOUR_AUTH0_CLIENT_ID を、ダッシュボードの DomainクライアントID の値に置き換えます
最後に、Application Details ページの Settings タブで、次の URL を設定します。Allowed Callback URLs:
https://{yourDomain}/android/PACKAGE_NAME/callback
許可済みのログアウト URL:
https://{yourDomain}/android/PACKAGE_NAME/callback
{yourDomain} を実際の Auth0 ドメイン (例: dev-abc123.us.auth0.com) に置き換えてください。
Allowed Callback URLs は、認証後にユーザーを安全にアプリケーションへ戻すための重要なセキュリティ対策です。一致する URL がない場合、ログイン処理は失敗し、ユーザーはアプリにアクセスできず、代わりに Auth0 のエラーページが表示されます。Allowed Logout URLs は、サインアウト時にシームレスなユーザー体験を提供するうえで重要です。一致する URL がない場合、ログアウト後にユーザーはアプリケーションへリダイレクトされず、代わりに汎用的な Auth0 ページに遷移します。URL スキームには、コールバックが対象のアプリにルーティングされるよう、パッケージ名 (com.auth0.samples.android) が含まれています。
重要: コールバック URL 内のパッケージ名が、build.gradle.ktsapplicationId と一致していることを確認してください。認証に失敗する場合は、これらの値が同一かどうかを確認してください。
https スキーム (上記で設定) を使用する場合は、コールバック URL がブラウザーではなくアプリに直接ルーティングされるよう、Android App Links を設定する必要があります。詳細は、以下の Troubleshooting & Advanced にある Configure Android App Links セクションを参照してください。
4

Auth0 SDKを初期化する

Activity で Auth0 と通信するための Auth0 インスタンスを作成します。MainActivity.kt で:
MainActivity.kt
import com.auth0.android.Auth0
import com.auth0.android.authentication.AuthenticationException
import com.auth0.android.callback.Callback
import com.auth0.android.provider.WebAuthProvider
import com.auth0.android.result.Credentials

class MainActivity : ComponentActivity() {
    private lateinit var auth0: Auth0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        // Auth0を初期化する
        auth0 = Auth0.getInstance(
            getString(R.string.com_auth0_client_id),
            getString(R.string.com_auth0_domain)
        )
    }
}
Auth0 インスタンスは、前の手順で設定した strings.xml ファイル内のクライアントIDとドメインを使用して初期化されます。このインスタンスは、以降のすべての認証処理で使用されます。
5

ログインとログアウトの実装

ログインを実装する: WebAuthProvider を使用して Universal Login ページを起動します。次のメソッドを MainActivity に追加します。
MainActivity.kt
private fun login() {
    WebAuthProvider.login(auth0)
        .withScheme("https")
        .withScope("openid profile email offline_access")
        .start(this, object : Callback<Credentials, AuthenticationException> {
            override fun onSuccess(credentials: Credentials) {
                // 認証情報を保存する
                // ユーザーは認証済み
            }

            override fun onFailure(exception: AuthenticationException) {
                // エラーを処理する
            }
        })
}
ログアウトを実装する: WebAuthProvider を使用してユーザーのセッションをクリアします。
MainActivity.kt
private fun logout() {
    WebAuthProvider.logout(auth0)
        .withScheme("https")
        .start(this, object : Callback<Void?, AuthenticationException> {
            override fun onSuccess(result: Void?) {
                // 保存した認証情報をクリアする
                // ユーザーはログアウト済み
            }

            override fun onFailure(exception: AuthenticationException) {
                // エラーを処理する
            }
        })
}
login() メソッドと logout() メソッドは、UI 内の対応するボタンをユーザーがタップしたときに呼び出してください。このコードでは、コンテキストパラメーターとして this (Activity を参照) を使用しています。これは、WebAuthProvider が Chrome Custom Tabs を起動し、認証フローを処理するために必要です。
6

アプリを実行

Android アプリをビルドして実行します。Android Studio で:
# Gradleファイルとプロジェクトを同期する(またはAndroid Studioの「Sync Now」を使用)
./gradlew clean build

# 接続されたデバイスまたはエミュレーターにビルドしてインストールする
./gradlew installDebug

# またはAndroid Studioから直接実行する
# 「Run」ボタンをクリックするか、Shift+F10を押す
想定されるフロー:
  1. アプリが「ログイン」ボタンとシールドアイコン付きで起動する
  2. 「ログイン」をタップ → Chrome Custom Tab が開く → ログインを完了
  3. 自動的にアプリに戻る
  4. 成功!!
Android では、複数のブラウザーがインストールされている場合、ブラウザーの選択ダイアログが表示されます。Auth0 の認証では、Chrome Custom Tabs を使用することで最適なユーザー体験が得られます。
チェックポイントこれで、Android デバイスまたはエミュレーター上で、Auth0 のログイン機能が完全に動作するようになっているはずです。アプリは安全な認証のために Chrome Custom Tabs を使用し、認証情報を自動的に保存します。

トラブルシューティングと高度な設定

Chrome Custom Tab からアプリにリダイレクトされない

解決策:
  1. Auth0 Dashboard の Allowed Callback URLsapplicationId と完全に一致していることを確認します
  2. build.gradle.kts の manifest placeholders が正しく設定されていることを確認します
  3. HTTPS とカスタムスキーム URL の両方が設定されていることを確認します
  4. クリーンして再ビルドします: BuildClean ProjectRebuild Project

アプリがクラッシュする: ‘Auth0 domain not found’

修正方法:
  1. com_auth0_domaincom_auth0_client_id の値が正しいことを確認します
  2. ドメインの形式にタイプミスがないことを確認します (https:// は含めないでください)

依存関係に関するビルドエラー

修正方法:
  1. build.gradle (プロジェクトレベル) で Android Gradle Plugin を最新バージョンに更新します
  2. プロジェクトを同期します: FileSync Project with Gradle Files
  3. ビルドをクリーンします: ./gradlew clean build

ユーザーによって認証がキャンセルされた

エラーコールバックで適切に処理してください:
override fun onFailure(exception: AuthenticationException) {
    when {
        exception.isAuthenticationCanceled -> 
            showMessage("Login was cancelled")
        exception.isBrowserAppNotAvailable -> 
            showMessage("No browser available")
        else -> 
            showMessage("Login failed: ${exception.getDescription()}")
    }
}

互換性のあるブラウザーがないというエラー

  • デバイスまたはエミュレーターに Chrome または別のモダンブラウザーをインストールします
  • より良いユーザー体験のために Chrome Custom Tabs を有効にします
  • Chrome がインストールされた実機でテストします
Android App Links を使用できない場合 (たとえば、対象の Android API バージョンが 23 未満の場合) は、代わりにカスタム URL スキームを設定できます。
カスタム URL スキームは、クライアントなりすまし攻撃を受ける可能性があるため、App Links よりも安全性が低くなります。可能な限り App Links を使用してください。
  1. app/build.gradle.ktsauth0Scheme の manifest プレースホルダーを更新します。
app/build.gradle.kts
android {
    defaultConfig {
        manifestPlaceholders += mapOf(
            "auth0Domain" to "@string/com_auth0_domain",
            "auth0Scheme" to "myapp" // 一意のカスタムスキームを使用
        )
    }
}
  1. Auth0 Dashboard のアプリケーション設定で、Allowed Callback URLsAllowed Logout URLs を更新し、カスタムスキームを使用するようにします。
myapp://{yourDomain}/android/PACKAGE_NAME/callback
  1. WebAuthProvider を呼び出すときにカスタムスキームを渡します。
MainActivity.kt
WebAuthProvider.login(auth0)
    .withScheme("myapp")
    .withScope("openid profile email offline_access")
    .start(this, callback)
カスタムスキームには小文字のみ使用できます

強化された認証情報セキュリティ

認証情報へのアクセスに生体認証を実装します。
AuthenticationManager.kt
class AuthenticationManager(private val context: Context) {
    
    private val credentialsManager: SecureCredentialsManager
    
    init {
        val authentication = AuthenticationAPIClient(auth0)
        val storage = SharedPreferencesStorage(context)
        credentialsManager = SecureCredentialsManager(context, authentication, storage)
        
        // 生体認証を有効にする
        credentialsManager.requireAuthentication(
            context as FragmentActivity,
            REQUEST_CODE_BIOMETRIC,
            "Biometric Authentication",
            "Please authenticate to access your account"
        )
    }
    
    companion object {
        private const val REQUEST_CODE_BIOMETRIC = 321
    }
}

カスタムスコープとオーディエンス

API に対して特定のスコープとオーディエンスをリクエストします。
AuthenticationManager.kt
fun login() {
    WebAuthProvider.login(auth0)
        .withScheme("https")
        .withScope("openid profile email offline_access read:posts")
        .withAudience("https://myapi.example.com")
        .withParameter("prompt", "login")
        .start(context as MainActivity, loginCallback)
}

ネットワーク設定

ネットワークセキュリティと証明書ピンニングに対応します。
app/src/main/res/xml/network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">your-auth0-domain.auth0.com</domain>
        <pin-set>
            <pin digest="SHA-256">AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</pin>
        </pin-set>
    </domain-config>
</network-security-config>
AndroidManifest.xml に追加します。
<application
    android:networkSecurityConfig="@xml/network_security_config"
    ... />