Cliente OAuth para Rust: biblioteca oauth2

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

Cliente OAuth para Rust: biblioteca oauth2

OAuth 2.0 es el estándar de la industria para la delegación de acceso. Se utiliza ampliamente para autorizar a usuarios a través de servicios de terceros (Google, GitHub, Facebook) sin compartir la contraseña. En el ecosistema de Rust, una de las bibliotecas más populares y maduras para implementar OAuth 2.0 es oauth2 (crate oauth2). Proporciona una API segura, asíncrona y flexible para trabajar con cualquier proveedor OAuth.



Características principales

  • Soporte para todos los grants estándar: Authorization Code, Client Credentials, Resource Owner Password Credentials, Implicit.
  • Soporte integrado para PKCE (Proof Key for Code Exchange) para mejorar la seguridad de clientes públicos.
  • Funcionamiento asíncrono utilizando reqwest o ureq internamente.
  • Seguridad de tipos: todos los tokens, URL y parámetros están estrictamente tipados, eliminando errores en tiempo de compilación.
  • Configuración flexible para cualquier proveedor mediante la configuración de endpoints y scopes.
  • Gestión de tokens: renovación automática (refresh), verificación de caducidad.


Instalación

Añada la dependencia a su Cargo.toml:

[dependencies]oauth2 = "4.4"tokio = { version = "1", features = ["full"] }serde = { version = "1", features = ["derive"] }reqwest = { version = "0.11", features = ["json"] }


Ejemplo básico: autorización a través de Google

Veamos el ciclo completo de OAuth 2.0 con el grant Authorization Code + PKCE para Google:



use oauth2::{    AuthorizationCode, AuthUrl, ClientId, ClientSecret, CsrfToken,    PkceCodeChallenge, RedirectUrl, Scope, TokenResponse, TokenUrl,};use oauth2::basic::BasicClient;use oauth2::reqwest::async_http_client;use url::Url;

#[tokio::main]async fn main() -> Result<(), Box> { // 1. Creamos el cliente con la configuración de Google let client = BasicClient::new( ClientId::new("SU_GOOGLE_CLIENT_ID".to_string()), Some(ClientSecret::new("SU_GOOGLE_CLIENT_SECRET".to_string())), AuthUrl::new("https://accounts.google.com/o/oauth2/v2/auth".to_string())?, Some(TokenUrl::new("https://oauth2.googleapis.com/token".to_string())?), ) .set_redirect_uri(RedirectUrl::new("http://localhost:8080/callback".to_string())?);

// 2. Generamos el PKCE challenge let (pkce_challenge, pkce_verifier) = PkceCodeChallenge::new_random_sha256();

// 3. Construimos la URL para la autorización del usuario let (auth_url, csrf_token) = client .authorize_url(CsrfToken::new_random) .add_scope(Scope::new("openid".to_string())) .add_scope(Scope::new("profile".to_string())) .add_scope(Scope::new("email".to_string())) .set_pkce_challenge(pkce_challenge) .url();

println!("Abra en su navegador: {}", auth_url);

// 4. (Simulación) obtenemos el código de autorización del usuario let code = "código_del_navegador_después_de_la_redirección";

// 5. Intercambiamos el código por un token let token_response = client .exchange_code(AuthorizationCode::new(code.to_string())) .set_pkce_verifier(pkce_verifier) .request_async(async_http_client) .await?;

println!("Access token: {}", token_response.access_token().secret()); println!("Refresh token: {:?}", token_response.refresh_token());

Ok(())}


Escenarios avanzados

1. Renovación del token (Refresh Token)

Cuando el access token caduca, use el refresh token para obtener uno nuevo:

use oauth2::RefreshToken;

let refresh_token = RefreshToken::new("su_refresh_token".to_string());let new_token = client .exchange_refresh_token(&refresh_token) .requ

Recommendations