---
title: "sdk/macos"
description: "SDK Swift para macOS que usa ASWebAuthenticationSession, flujo de código de autorización PKCE S256 y almacenamiento de tokens en Keychain. Comparte el patrón de implementación con sdk/ios."
locale: "es"
---

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

# sdk/macos

## Estado

El estado del paquete es **Implementado y verificado localmente**. La suite de pruebas unitarias de Swift se ejecuta correctamente en macOS. El acceso al Keychain, el callback completo de ASWebAuthenticationSession y un recorrido de ida y vuelta con un IdP real aún requieren evidencias de integración de escritorio. Esta página documenta el comportamiento implementado; no afirma que esté listo para producción.

Estado del registro: UNPUBLISHED. Instala este SDK únicamente desde el checkout del código fuente del repositorio; no uses un registro de paquetes externo.

## Requisitos

- macOS 13+
- Swift 5.9+ y Xcode 15+
- Sin dependencias de terceros: usa los frameworks del sistema Apple (AuthenticationServices, CryptoKit, Security)

## Instalación

Añade mediante Swift Package Manager en Package.swift:

```swift
// Package.swift
dependencies: [
.package(path: "../vonvon/sdk/macos"),
],
targets: [
.target(name: "YourApp", dependencies: [.product(name: "Vonvon", package: "macos")]),
]
```

## Inicio rápido

```swift
import Vonvon

let client = VonvonClient()

// 1. Configure. offline_access is rejected until DPoP is implemented.
client.configure(VonvonOptions(
issuer: URL(string: "https://vonvon.id")!,
clientId: "your_client_id",
redirectUri: "yourapp://callback"
))

// 2. Sign in (opens ASWebAuthenticationSession)
let session = try await client.signIn()

// 3. Get the current unexpired access token. Expiry requires reauthorization.
let token = try await client.getAccessToken()

// 4. Get the current unexpired session.
let current = try await client.getSession()

// 5. Clear local state and optionally call end_session.
try await client.signOut()
```

## API principal

| Método | Descripción |
| --- | --- |
| `configure(_ options:)` | Establece issuer, clientId, redirectUri y scopes. Llámalo antes que todos los demás métodos. |
| `signIn() async throws -> VonvonSession` | Lanza ASWebAuthenticationSession, completa el flujo de código de autorización PKCE S256, persiste los tokens en el Keychain y devuelve una sesión. |
| `handleRedirect(_ url:) async throws -> VonvonSession` | Procesa una URL de redirección de una fuente externa e intercambia el código por tokens. |
| `getSession() async throws -> VonvonSession?` | Devuelve la sesión macOS actual no caducada; se borra el estado del token caducado y el método devuelve nil. |
| `getAccessToken() async throws -> String` | Devuelve el token de acceso actual no caducado. El SDK rechaza offline\_access hasta que se implemente DPoP; la caducidad exige volver a autorizar. |
| `signOut() async throws` | Borra los tokens del Keychain y, opcionalmente, llama al endpoint end\_session; no se revoca el token de actualización. |

## Relación con sdk/ios

El SDK de macOS comparte el mismo patrón de implementación Swift que sdk/ios: ASWebAuthenticationSession para autorización basada en navegador, CryptoKit para PKCE S256 y Keychain para almacenamiento de tokens. Los dos paquetes apuntan a mínimos de plataforma Apple diferentes y se mantienen por separado para permitir la configuración de permisos específicos de cada plataforma.

## Seguridad

- Cliente público: no se almacena ni transmite ningún secreto de cliente.
- Solo PKCE S256. El servidor rechaza el método plain de challenge.
- Estado OAuth generado por solicitud; validado en la redirección para prevenir CSRF.
- Tokens almacenados en Keychain con acceso solo en el dispositivo; no se sincronizan con iCloud Keychain.

## Limitaciones conocidas

- La verificación ES256/RS256 de ID token basada en JWKS y el cierre de sesión end\_session están implementados y probados localmente. La validación real de Keychain de macOS e IdP sigue siendo necesaria para L4.
- La extracción del núcleo Swift compartido con sdk/ios está planificada pero aún no se ha realizado: cada paquete lleva su propia copia de la implementación.

Source: https://vonvon.id/es/sdks/macos/index.mdx
