Passport (autenticación)
Corvis no tiene una integración con Passport ni un sistema equivalente de "estrategias" de autenticación intercambiables (local, JWT, OAuth...). Tampoco hay todavía clientes OAuth2/OpenID Connect integrados.
Alternativa: JwtModule + guards
Las piezas para autenticar con tokens están en el framework y cubren el caso más común, el de una API con JWT:
JwtModule::register(JwtModuleOptions::new(secret))oJwtModule::register_async(global, |ctx| ...)para configurar la firma;JwtService::signyJwtService::verify(overify_or_unauthorized, que ya devuelve un401);extract_bearer_token(&request)para leer la cabeceraAuthorization: Bearer ...;- un guard que verifica el token y deja el usuario en la request con
request.insert(user); - un parámetro
FromContext(el equivalente a un decorador@User()) que lo recupera en el handler.
El guard de examples/tertulia (src/auth/auth_guard.rs) hace exactamente eso:
rust
#[injectable]
pub struct AuthGuard {
jwt: Arc<JwtService>,
}
#[async_trait]
impl CanActivate for AuthGuard {
async fn can_activate(&self, ctx: &ExecutionContext) -> Result<bool, HttpException> {
let request = ctx.switch_to_http().get_request();
let token = extract_bearer_token(request).ok_or_else(|| UnauthorizedException::new("Missing bearer token"))?;
let user: ChatUser = self.jwt.verify_or_unauthorized(&token)?;
request.insert(user);
Ok(true)
}
}El flujo completo (login, guard, usuario actual, roles) se explica en Autenticación y Autorización. Para un inicio de sesión con usuario y contraseña, el "paso local" de Passport es un endpoint propio que verifica la contraseña (ver Cifrado y hashing) y devuelve el token.