OAuth 2.0 y autorización JWT en Swift: guía completa para principiantes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: ¿por qué es necesaria la autorización en aplicaciones móviles?

Las aplicaciones iOS modernas rara vez funcionan de forma aislada. Se comunican con servidores, envían datos, reciben contenido personalizado. Pero, ¿cómo puede el servidor saber que la solicitud fue enviada por el usuario que dice ser? Aquí es donde vienen al rescate OAuth 2.0 y JWT (JSON Web Token). No son solo siglas de moda, sino estándares de seguridad que subyacen en el funcionamiento de la mayoría de las API modernas (Google, Facebook, GitHub, su propio backend).

En este artículo, analizaremos cómo funcionan OAuth 2.0 y JWT en Swift. Aprenderá en qué se diferencian, cómo implementarlos correctamente y qué trampas esperan al principiante. Escribiremos código para obtener, almacenar y actualizar tokens. ¡Vamos allá!



1. Conceptos básicos: OAuth 2.0 y JWT: ¿cuál es la diferencia?

Muchas personas confunden estos dos conceptos. En realidad, son diferentes niveles de abstracción.

  • OAuth 2.0 es un protocolo de autorización. Describe cómo una aplicación (cliente) puede acceder a los recursos de un usuario en un servidor de terceros (por ejemplo, a sus fotos en Google) sin transferir nombre de usuario y contraseña. La idea principal es la emisión de tokens de acceso temporales.
  • JWT es un formato de token. Es una cadena compacta y segura para URL que contiene datos JSON (por ejemplo, id de usuario, rol, fecha de caducidad) y una firma. JWT se usa a menudo como access token en OAuth 2.0, pero también se puede usar por separado.

Una analogía simple: OAuth 2.0 son las reglas para emitir un pase para un estadio, y JWT es el propio pase de plástico con su foto y sello.

En un escenario típico, una aplicación iOS:

  1. Abre un navegador para iniciar sesión a través de un proveedor OAuth (Google, Apple ID, su propio servidor).
  2. Obtiene un código de autorización.
  3. Intercambia el código por un token de acceso (a menudo en formato JWT) y un token de actualización.
  4. Usa el token de acceso para solicitudes a la API.
  5. Cuando el token de acceso caduca, usa el token de actualización para obtener uno nuevo.


2. Estructura del token JWT

JWT consta de tres partes, separadas por puntos:

header.payload.signature

Ejemplo de un JWT decodificado:

// Header (encabezado){  "alg": "HS256",  "typ": "JWT"}// Payload (carga útil){  "sub": "1234567890",  "name": "Iván Petrov",  "iat": 1516239022,  "exp": 1516242622}// Signature (firma) - creada por el servidor

Importante: El payload de JWT no está cifrado, solo está codificado en Base64. Cualquiera puede leerlo. La confidencialidad la proporciona la firma: si el servidor ve que la firma no coincide, rechaza el token. Por lo tanto, nunca almacene contraseñas o datos secretos en JWT.



3. Implementación de OAuth 2.0 y JWT en Swift

Ahora pasemos a la práctica. Escribiremos una clase para trabajar con la autorización. Para simplificar, usaremos el URLSession integrado, aunque en proyectos reales a menudo se usa Alamofire o SwiftUI + async/await.



3.1. Modelos de datos

struct AuthResponse: Codable {    let accessToken: String    let refreshToken: String?    let expiresIn: Int        enum CodingKeys: String, CodingKey {        case accessToken = "access_token"        case refreshToken = "refresh_token"        case expiresIn = "expires_in"    }}

struct UserProfile: Codable { let id: String let name: String let email: String}


3.2. Servicio de autorización

Crearemos una clase AuthService que se encargará de obtener y actualizar los tokens. Tenga en cuenta: en una aplicación real, la URL y el clientSecret deben almacenarse de forma segura (por ejemplo, en Keychain o a través de un servidor de configuración).

class AuthService {    static let shared = A                

Blogs

Book Recommendations