---
title: "sdk/android"
description: "SDK Kotlin para Android usando Chrome Custom Tabs, fluxo de código deautorização PKCE S256 e armazenamento de tokens comEncryptedSharedPreferences baseado em Keystore."
locale: "pt-BR"
---

> Documentation Index
> Fetch the relevant documentation index at: https://vonvon.id/pt-br/sdks/llms.txt
> Use this file to discover all available pages before exploring further.

# sdk/android

## Estado

O status do package é **Implementado e verificado localmente**. A suíte de testes unitários JVM passa e cobre PKCE, tratamento de estado e nonce, capacidade de convidado e contratos de armazenamento. EncryptedSharedPreferences, Chrome Custom Tabs, App Links e um ciclo completo com um IdP real ainda exigem um dispositivo ou emulador. Esta página documenta o comportamento implementado; não é uma declaração de prontidão para produção.

Status do registry: UNPUBLISHED. Instale este SDK somente a partir do checkout do código-fonte do repositório; não use um registry de pacotes externo.

## Requisitos

- Android API 26+ (Android 8.0)
- Kotlin 1.9+ e AndroidX

## Instalação

Adicione a dependência ao build.gradle.kts do módulo do seuaplicativo:

```kotlin
// settings.gradle.kts
includeBuild("../vonvon/sdk/android")

// app/build.gradle.kts
dependencies {
implementation("dev.vonvon:vonvon-android:0.1.0-alpha.0")
}
```

## Configuração do manifesto

Registre uma Activity de callback com um intent-filter. App Links(esquema HTTPS com autoVerify) são recomendados em vez de esquemaspersonalizados:

```xml
<!-- AndroidManifest.xml -->
<activity android:name=".AuthCallbackActivity" android:exported="true">
<intent-filter android:autoVerify="true">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="https"
          android:host="yourapp.example.com"
          android:pathPrefix="/auth/callback" />
</intent-filter>
</activity>
```

## Início rápido

```kotlin
import dev.vonvon.sdk.Vonvon
import dev.vonvon.sdk.model.VonvonConfig

// 1. Initialize in Application.onCreate. offline_access is rejected until DPoP is implemented.
Vonvon.configure(
context = this,
config = VonvonConfig(
    issuer = "https://vonvon.id",
    clientId = "your_client_id",
    redirectUri = "https://yourapp.example.com/auth/callback",
    scopes = listOf("openid", "profile", "email"),
)
)

// 2. Sign in (opens Chrome Custom Tabs)
lifecycleScope.launch { Vonvon.signIn(requireContext()) }

// 3. Handle redirect in AuthCallbackActivity
val session = Vonvon.handleRedirect(intent.data.toString())

// 4. Read the current unexpired session. Expiry requires reauthorization.
val session = Vonvon.getSession()

// 5. Get the current unexpired access token.
val token = Vonvon.getAccessToken()

// 6. Clear local state and optionally open end_session.
Vonvon.signOut(context = this, openEndSession = true)
```

## API principal

| Método | Assinatura |
| --- | --- |
| `configure` | `fun configure(context: Context, config: VonvonConfig)` |
| `signIn` | `suspend fun signIn(context: Context, options: SignInOptions? = null)` |
| `handleRedirect` | `suspend fun handleRedirect(url: String): VonvonSession` |
| `getSession` | `suspend fun getSession(): VonvonSession?` |
| `getAccessToken` | `suspend fun getAccessToken(options: GetAccessTokenOptions? = null): String` |
| `signOut` | `suspend fun signOut(context: Context? = null, openEndSession: Boolean = false)` |
| `setTokenStorage` | `fun setTokenStorage(adapter: TokenStorageAdapter)` |

## Tipos de erro

Todos os erros do SDK são subtipos da sealed class VonvonException:

| Subclasse | Gatilho |
| --- | --- |
| `NotConfigured` | configure() não foi chamado |
| `UserCancelled` | O usuário fechou as Custom Tabs sem concluir |
| `StateMismatch` | Divergência de state OAuth — possível CSRF |
| `TokenExchangeFailed` | O endpoint de token retornou um erro |
| `TokenValidationFailed` | Falha na validação da assinatura ou dos claims do token de ID |
| `NoSession` | Método de sessão chamado enquanto desconectado |

## Segurança

- Cliente público — nenhum segredo de cliente armazenado ou transmitido.
- Apenas PKCE S256. O servidor rejeita o método de desafio plain.
- EncryptedSharedPreferences baseado em Android Keystore (AES-256-GCM)protege o armazenamento de tokens em repouso.
- State OAuth aleatório gerado por requisição; validado noredirecionamento para prevenir CSRF.

## Limitações conhecidas

- A verificacao de ID token com JWKS esta implementada e testada localmente. Testes com dispositivo ou emulador Android e IdP real ainda sao necessarios para L4.
- Nenhum mecanismo para detectar quando o usuário fecha as Custom Tabssem concluir a autorização.
- Apenas conta única — a camada de armazenamento usa chaves fixas.

Source: https://vonvon.id/pt-br/sdks/android/index.mdx
