Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ sidebar_custom_props:
description: Android-Integrationsanleitung.
language: kotlin/java
official_link: https://developer.android.com
app_type: Native app
app_type: Native App
framework: Android
---

Expand All @@ -31,17 +31,17 @@ import ConfigApiResources from './api-resources/_config-api-resources.mdx';
import FetchAccessTokenForApiResources from './api-resources/_fetch-access-token-for-api-resources.mdx';
import FetchOrganizationTokenForUser from './api-resources/_fetch-organization-token-for-user.mdx';

# Authentifizierung zu deiner Android (Kotlin/Java)-Anwendung hinzufügen
# Authentifizierung zu deiner Android (Kotlin/Java)-Anwendung hinzufügen (Add authentication to your Android (Kotlin/Java) application)

Diese Anleitung zeigt dir, wie du Logto in deine Android-Anwendung integrierst.

<AndroidGuideTip />

## Voraussetzungen \{#prerequisites}

- Ein [Logto Cloud](https://cloud.logto.io)-Konto oder ein [selbst gehostetes Logto](/introduction/set-up-logto-oss).
- Eine Logto-native Anwendung erstellt.
- Ein Kotlin-Android-Anwendungsprojekt.
- Ein [Logto Cloud](https://cloud.logto.io)-Konto oder eine [selbst gehostete Logto](/introduction/set-up-logto-oss).
- Eine erstellte Logto Native-Anwendung.
- Ein Kotlin Android-Anwendungsprojekt.

## Installation \{#installation}

Expand All @@ -64,16 +64,16 @@ Diese Anleitung zeigt dir, wie du Logto in deine Android-Anwendung integrierst.

In Android folgt die Redirect-URI dem Muster: `$(LOGTO_REDIRECT_SCHEME)://$(YOUR_APP_PACKAGE)/callback`:

- Das `LOGTO_REDIRECT_SCHEME` sollte ein benutzerdefiniertes Schema im umgekehrten Domain-Format sein.
- Das `LOGTO_REDIRECT_SCHEME` sollte ein benutzerdefiniertes Schema im Reverse-Domain-Format sein.
- Das `YOUR_APP_PACKAGE` ist der Paketname deiner App.

Angenommen, du behandelst `io.logto.android` als das benutzerdefinierte `LOGTO_REDIRECT_SCHEME` und `io.logto.sample` ist dein App-Paketname, sollte die Redirect-URI `io.logto.android://io.logto.sample/callback` sein.
Angenommen, du verwendest `io.logto.android` als benutzerdefiniertes `LOGTO_REDIRECT_SCHEME` und `io.logto.sample` ist dein App-Paketname, dann sollte die Redirect-URI `io.logto.android://io.logto.sample/callback` lauten.

<Tabs groupId="android-sdk-version">

<TabItem default value="v3" label="v3 (beta)">
<TabItem default value="v3" label="v3">

In v3 öffnet sich die Anmeldeerfahrung in einem [Custom Tab](https://developer.android.com/develop/ui/views/layout/webapps/overview-of-android-custom-tabs) (dem Systembrowser), und die Weiterleitung wird über einen Intent-Filter auf Betriebssystemebene zurück zu deiner App geleitet. Du musst das Schema deiner Redirect-URI mit dem Manifest-Platzhalter `logtoRedirectScheme` in der Build-Datei deiner App deklarieren:
In v3 öffnet sich die Anmeldeerfahrung in einem [Custom Tab](https://developer.android.com/develop/ui/views/layout/webapps/overview-of-android-custom-tabs) (dem Systembrowser), und die Weiterleitung wird über einen OS-Level Intent-Filter zurück zu deiner App geleitet. Du musst das Schema deiner Redirect-URI mit dem Manifest-Platzhalter `logtoRedirectScheme` in der Build-Datei deiner App deklarieren:

<Tabs>

Expand Down Expand Up @@ -103,13 +103,13 @@ android {

</Tabs>

Zusätzlich erzwingt v3 das Redirect-URI-Muster durch Android's Intent-Filter-Matching, sodass eine Redirect-URI, die vom Muster abweicht, niemals an deine App zugestellt wird:
Zusätzlich erzwingt v3 das Redirect-URI-Muster durch das Intent-Filter-Matching von Android, sodass eine Redirect-URI, die vom Muster abweicht, niemals an deine App übergeben wird:

- Das Schema muss dem Manifest-Platzhalter `logtoRedirectScheme` entsprechen.
- Der Host muss deine `applicationId` sein.
- Der Pfad muss `/callback` sein.

Halte das Schema und den Host in Kleinbuchstaben, da Intent-Filter-Matching zwischen Groß- und Kleinschreibung unterscheidet und Browser das Schema in Kleinbuchstaben umwandeln.
Halte das Schema und den Host kleingeschrieben, da das Intent-Filter-Matching zwischen Groß- und Kleinschreibung unterscheidet und Browser das Schema kleinschreiben.

<details>

Expand All @@ -119,18 +119,18 @@ Halte das Schema und den Host in Kleinbuchstaben, da Intent-Filter-Matching zwis

</summary>

Um [Android App Links](https://developer.android.com/training/app-links) (eine `https`-Redirect-URI auf einer Domain, die du besitzt) statt des benutzerdefinierten Schemas zu verwenden:
Um [Android App Links](https://developer.android.com/training/app-links) (eine `https`-Redirect-URI auf einer eigenen Domain) statt des benutzerdefinierten Schemas zu verwenden:

1. Hoste die [Digital Asset Links](https://developers.google.com/digital-asset-links/v1/getting-started)-Datei unter `https://your.domain/.well-known/assetlinks.json`, indem du deine Anwendungs-ID und die SHA-256-Fingerprints deiner Signaturzertifikate angibst. Wenn du mit Play App Signing veröffentlichst, findest du den Release-Fingerprint in der Play Console unter **Setup** > **App signing**. Die Datei muss als `Content-Type: application/json` mit HTTP 200 und ohne Weiterleitungen bereitgestellt werden.
1. Hoste die [Digital Asset Links](https://developers.google.com/digital-asset-links/v1/getting-started)-Datei unter `https://your.domain/.well-known/assetlinks.json`, in der deine Application ID und die SHA-256-Fingerabdrücke deiner Signaturzertifikate deklariert werden. Beim Veröffentlichen mit Play App Signing findest du den Release-Fingerabdruck in der Play Console unter **Setup** > **App signing**. Die Datei muss als `Content-Type: application/json` mit HTTP 200 und ohne Weiterleitungen bereitgestellt werden.

2. Deklariere den App Links Intent-Filter auf der Redirect-Receiver-Aktivität des SDK `io.logto.sdk.android.auth.logto.LogtoRedirectReceiverActivity` in deiner `AndroidManifest.xml`-Datei. Wenn du das benutzerdefinierte Schema überhaupt nicht verwendest, entferne den eingebauten Filter des SDK mit `tools:node="removeAll"`, und der Manifest-Platzhalter `logtoRedirectScheme` ist dann nicht mehr erforderlich:
2. Deklariere den App Links Intent-Filter auf der Redirect-Receiver-Activity des SDKs `io.logto.sdk.android.auth.logto.LogtoRedirectReceiverActivity` in deiner `AndroidManifest.xml`-Datei. Wenn du das benutzerdefinierte Schema gar nicht verwendest, entferne den eingebauten Filter des SDKs mit `tools:node="removeAll"`, und der Manifest-Platzhalter `logtoRedirectScheme` ist dann nicht mehr erforderlich:

```xml title="AndroidManifest.xml"
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application>
<activity android:name="io.logto.sdk.android.auth.logto.LogtoRedirectReceiverActivity">
<!-- Diese Zeile weglassen, um die Weiterleitung über das benutzerdefinierte Schema zusätzlich beizubehalten. -->
<!-- Diese Zeile weglassen, um das Custom-Scheme-Redirect weiterhin zu unterstützen. -->
<intent-filter tools:node="removeAll" />
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
Expand All @@ -143,23 +143,23 @@ Um [Android App Links](https://developer.android.com/training/app-links) (eine `
</manifest>
```

3. Füge `https://your.domain/callback` als Redirect-URI (und, falls sie für die Abmeldung verwendet wird, als Post-Abmelde-Redirect-URI) auf der Anwendungsdetailseite der Logto Console hinzu und übergebe sie an `signIn` / `signOut`.
3. Füge `https://your.domain/callback` als Redirect-URI (und, falls für Sign-out verwendet, als Post-Sign-out-Redirect-URI) auf der Anwendungsdetailseite der Logto Console hinzu und übergebe sie an `signIn` / `signOut`.

Beachte, dass der Callback jetzt eine echte URL auf deiner Domain ist, also stelle dort eine Fallback-Seite bereit (z. B. einen Zurück zur App"-Button) für Browser, die App Links bei einer Server-Weiterleitung nicht starten. Der Button muss nur auf die aktuelle URL verlinken (z. B. `href` auf `window.location.href` setzen): Die Autorisierungsparameter befinden sich im Query-String, und ein benutzerinitierter Klick gibt der gleichen URL eine weitere Chance, zu deiner App weitergeleitet zu werden. Auf Android 12+ öffnet eine nicht verifizierte Domain niemals die App, sodass eine fehlerhafte `assetlinks.json` stillschweigend fehlschlägt. Du kannst den Verifikationsstatus mit `adb shell pm get-app-links <applicationId>` überprüfen.
Beachte, dass der Callback jetzt eine echte URL auf deiner Domain ist, daher solltest du dort eine Fallback-Seite bereitstellen (z. B. einen "Zurück zur App"-Button) für Browser, die App Links bei einer Server-Weiterleitung nicht öffnen. Der Button muss nur auf die aktuelle URL verlinken (z. B. `href` auf `window.location.href` setzen): Die Autorisierungsparameter befinden sich in der Query-String, und ein vom Benutzer ausgelöster Klick gibt derselben URL eine weitere Chance, zu deiner App weitergeleitet zu werden. Ab Android 12+ öffnet eine nicht verifizierte Domain die App nie, daher schlägt ein fehlerhaftes `assetlinks.json` stillschweigend fehl. Du kannst den Verifizierungsstatus mit `adb shell pm get-app-links <applicationId>` prüfen.

</details>

</TabItem>

<TabItem value="v2" label="v2">

Es ist keine zusätzliche Konfiguration erforderlich. Die Anmeldeerfahrung öffnet sich in einer eingebetteten WebView, und das SDK fängt die Weiterleitung innerhalb der WebView ab.
Keine zusätzliche Einrichtung erforderlich. Die Anmeldeerfahrung öffnet sich in einer eingebetteten WebView, und das SDK fängt die Weiterleitung innerhalb der WebView ab.

</TabItem>

</Tabs>

### Anmeldung und Abmeldung implementieren \{#implement-sign-in-and-sign-out}
### Sign-in und Sign-out implementieren \{#implement-sign-in-and-sign-out}

<ImplementSignInAndSignOut />

Expand All @@ -169,13 +169,13 @@ Es ist keine zusätzliche Konfiguration erforderlich. Die Anmeldeerfahrung öffn

### Benutzerinformationen anzeigen \{#display-user-information}

Um die Informationen des Benutzers anzuzeigen, kannst du die Methode `logtoClient.getIdTokenClaims()` verwenden. Zum Beispiel kannst du Benutzerinformationen in einem ViewModel abrufen und dann in deiner Aktivität anzeigen:
Um die Informationen des Benutzers anzuzeigen, kannst du die Methode `logtoClient.getIdTokenClaims()` verwenden. Zum Beispiel kannst du Benutzerinformationen in einem ViewModel abrufen und dann in deiner Activity anzeigen:

```kotlin title="LogtoModelView.kt"
class LogtoViewModel(application: Application) : AndroidViewModel(application) {
// ...andere Codes

// Füge ein Live-Daten-Objekt hinzu, um die ID-Token-Ansprüche zu beobachten
// Füge ein LiveData hinzu, um die ID-Token-Ansprüche zu beobachten
private val _idTokenClaims = MutableLiveData<IdTokenClaims>()
val idTokenClaims: LiveData<IdTokenClaims>
get() = _idTokenClaims
Expand All @@ -194,7 +194,7 @@ class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
//...andere Codes

// Angenommen, du hast eine Textansicht mit der ID `user_info_text_view` in deinem Layout
// Angenommen, du hast eine TextView mit der ID `user_info_text_view` in deinem Layout
val userInfoResponseTextView: TextView = findViewById(R.id.user_info_text_view)
logtoViewModel.userInfoResponse.observe(this) { userInfoResponse ->
userInfoResponseTextView.text = if (userInfoResponse !== null) {
Expand Down Expand Up @@ -231,7 +231,7 @@ Dann kannst du auf die zusätzlichen Ansprüche im Rückgabewert von `logtoClien
logtoClient.getIdTokenClaims { logtoException, idTokenClaims ->
println("IdTokenClaims:$idTokenClaims")
}
// Jetzt kannst du auf zusätzliche Ansprüche `claims.email`, `claims.phone`, etc. zugreifen.
// Jetzt kannst du auf zusätzliche Ansprüche wie `claims.email`, `claims.phone` usw. zugreifen.
```

<ClaimsNeedNetworkRequest
Expand All @@ -244,7 +244,7 @@ logtoClient.getIdTokenClaims { logtoException, idTokenClaims ->
>{`logtoClient.fetchUserInfo {_, userInfoResponse ->
println("UserInfoResponse:$userInfoResponse")
}
// Jetzt kannst du auf den Anspruch \`userInfo.custom_data\` zugreifen`}</CodeBlock>
// Jetzt kannst du auf den Anspruch \`userInfo.custom_data\` zugreifen.`}</CodeBlock>
}
/>

Expand All @@ -264,10 +264,10 @@ logtoClient.getIdTokenClaims { logtoException, idTokenClaims ->

<FetchAccessTokenForApiResources />

### Organisationstokens abrufen \{#fetch-organization-tokens}
### Organisationstoken abrufen \{#fetch-organization-tokens}

<FetchOrganizationTokenForUser />

## Weiterführende Lektüre \{#further-readings}
## Weiterführende Literatur \{#further-readings}

<FurtherReadings />
Loading
Loading