iOS y Android
Las apps nativas inician la sesión de las personas a través del Lobby de su entorno en el navegador del sistema, nunca en una vista web: así se usan las llaves de acceso, las contraseñas guardadas y la sesión de Usher, y la app nunca ve una contraseña. Los SDK se encargan del resto de OpenID Connect y guardan los tokens en el dispositivo.
Registra la app
En Usher Console, abre el entorno y ve a Aplicaciones → Nueva aplicación → Móvil o escritorio. Indica una redirección de uso privado basada en un dominio que sea tuyo, como com.example.notes:/oauth/callback. Recibe un ID de cliente y ningún secreto: una app en un teléfono no puede guardarlo, así que usa PKCE. Console muestra la configuración para las dos plataformas.
iOS y macOS
import UsherKit
let usher = UsherClient(configuration: .init(
issuer: URL(string: "https://login.example.com")!,
clientID: "…",
redirectURI: URL(string: "com.example.notes:/oauth/callback")!))
let session = try await usher.signIn()
var request = URLRequest(url: URL(string: "https://api.example.com/notes")!)
try await usher.authorize(&request)Los tokens se guardan en el llavero, solo en este dispositivo.
Android
// build.gradle.kts: manifestPlaceholders["usherRedirectScheme"] = "com.example.notes"
val usher = Usher.client(context, UsherConfiguration(
issuer = "https://login.example.com",
clientId = "…",
redirectUri = "com.example.notes:/oauth/callback"))
val session = usher.signIn(Usher.customTabs(activity))El inicio de sesión se abre en una pestaña personalizada (Custom Tab). La sesión se cifra con una clave del Android Keystore.
Qué comprueban los SDK
- PKCE, state y nonce en cada inicio de sesión, y el emisor que figura en la respuesta (RFC 9207).
- La firma del token de ID con las claves de tu entorno, y su emisor, su audiencia y su caducidad.
- Los tokens de actualización rotan: cada uno se usa una sola vez. Al cerrar la sesión, se revoca en Usher.
- DPoP, si lo activas: tokens vinculados a una clave del dispositivo, inútiles si se copian a otro sitio.
Para llamar a tu propia API con el token de acceso, ponle nombre a la API y pídela con resources: consulta Tus propias API.