ng g component login
/src
|-- /app
|-- /components
|-- login
|-- login.component.ts
|-- login.component.html
|-- login.component.css
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { ReactiveFormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
import { LoginComponent } from './components/login/login.component';
@NgModule({
declarations: [
AppComponent,
LoginComponent
],
imports: [
BrowserModule,
ReactiveFormsModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
import { Component } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.css']
})
export class LoginComponent {
loginForm: FormGroup;
constructor(private fb: FormBuilder) {
this.loginForm = this.fb.group({
email: ['', [Validators.required, Validators.email]],
password: ['', [Validators.required, Validators.minLength(6)]]
});
}
onSubmit() {
if (this.loginForm.valid) {
const formData = this.loginForm.value;
console.log('Usuario autenticado:', formData);
// Aquí puedes realizar la lógica de autenticación
}
}
}
<div>
<label for="password">Contraseña</label>
<input type="password" id="password" formControlName="password" />
<div *ngIf="loginForm.get('password')?.invalid && loginForm.get('password')?.touched">
<small *ngIf="loginForm.get('password')?.errors?.required">La contraseña es obligatoria.</small>
<small *ngIf="loginForm.get('password')?.errors?.minlength">Mínimo 6 caracteres.</small>
</div>
</div>
<button type="submit" [disabled]="loginForm.invalid">Iniciar Sesión</button>
</form> </div>
4. Código en el archivo login.component.css
```css
.login-container {
max-width: 400px;
margin: auto;
padding: 20px;
border: 1px solid #ccc;
border-radius: 5px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
label {
display: block;
margin-bottom: 5px;
}
input {
width: 100%;
padding: 10px;
margin-bottom: 10px;
border: 1px solid #ccc;
border-radius: 4px;
}
button {
width: 100%;
padding: 10px;
background-color: #007bff;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
button:disabled {
background-color: #ccc;
}
Crear un proyecto en Firebase.
Registrar la aplicación Web.
Instalar Firebase y AngularFire.
npm install firebase @angular/fire
Configurar Firebase en Angular.
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { ReactiveFormsModule } from '@angular/forms';
import { AngularFireModule } from '@angular/fire';
import { AngularFireAuthModule } from '@angular/fire/auth';
import { environment } from '../environments/environment';
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent,
// Otros componentes...
],
imports: [
BrowserModule,
ReactiveFormsModule,
AngularFireModule.initializeApp(environment.firebase), // Inicializa Firebase
AngularFireAuthModule // Importa el módulo de autenticación
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
export const environment = {
production: false,
firebase: {
apiKey: "TU_API_KEY",
authDomain: "TU_AUTH_DOMAIN",
projectId: "TU_PROJECT_ID",
storageBucket: "TU_STORAGE_BUCKET",
messagingSenderId: "TU_MESSAGING_SENDER_ID",
appId: "TU_APP_ID"
}
};
Crear un Servicio de Autenticación.
ng generate service auth
import { Injectable } from '@angular/core';
import { AngularFireAuth } from '@angular/fire/auth';
import firebase from 'firebase/compat/app';
@Injectable({
providedIn: 'root'
})
export class AuthService {
constructor(private afAuth: AngularFireAuth) {}
// Método para registrar un usuario
async register(email: string, password: string) {
return await this.afAuth.createUserWithEmailAndPassword(email, password);
}
// Método para iniciar sesión
async login(email: string, password: string) {
return await this.afAuth.signInWithEmailAndPassword(email, password);
}
// Método para cerrar sesión
async logout() {
return await this.afAuth.signOut();
}
}
Usar el servicio en un componente.
import { Component } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { AuthService } from '../auth.service';
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.css']
})
export class LoginComponent {
loginForm: FormGroup;
constructor(private fb: FormBuilder, private authService: AuthService) {
this.loginForm = this.fb.group({
email: ['', [Validators.required, Validators.email]],
password: ['', [Validators.required, Validators.minLength(6)]]
});
}
async onSubmit() {
if (this.loginForm.valid) {
const { email, password } = this.loginForm.value;
try {
await this.authService.login(email, password);
console.log('Inicio de sesión exitoso');
} catch (error) {
console.error('Error al iniciar sesión:', error);
}
}
}
}
import { Injectable } from '@angular/core';
import { AngularFireAuth } from '@angular/fire/auth';
import firebase from 'firebase/compat/app';
@Injectable({
providedIn: 'root'
})
export class AuthService {
constructor(private afAuth: AngularFireAuth) {}
// Método para registrar un usuario
async register(email: string, password: string) {
return await this.afAuth.createUserWithEmailAndPassword(email, password);
}
// Método para iniciar sesión
async login(email: string, password: string): Promise<string | null> {
const userCredential = await this.afAuth.signInWithEmailAndPassword(email, password);
const token = await userCredential.user?.getIdToken(); // Obtener el token
return token; // Devolver el token
}
// Método para cerrar sesión
async logout() {
return await this.afAuth.signOut();
}
}
Ahora puedes usar el token en el componente de inicio de sesión después de que el usuario se haya autenticado.
import { Component } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { AuthService } from '../auth.service';
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.css']
})
export class LoginComponent {
loginForm: FormGroup;
constructor(private fb: FormBuilder, private authService: AuthService) {
this.loginForm = this.fb.group({
email: ['', [Validators.required, Validators.email]],
password: ['', [Validators.required, Validators.minLength(6)]]
});
}
async onSubmit() {
if (this.loginForm.valid) {
const { email, password } = this.loginForm.value;
try {
const token = await this.authService.login(email, password);
console.log('Inicio de sesión exitoso. Token:', token);
// Aquí puedes almacenar el token en el almacenamiento local o en un servicio
localStorage.setItem('token', token || ''); // Almacenar el token
} catch (error) {
console.error('Error al iniciar sesión:', error);
}
}
}
}
const token = localStorage.getItem('token');
const headers = new HttpHeaders({
Authorization: `Bearer ${token}`
});
// Realiza la llamada a la API con los headers
this.httpClient.get('https://api.example.com/secure-data', { headers }).subscribe(data => {
console.log('Datos seguros:', data);
});
Crear un servicio que gestione la autenticación y la obtención del token. Este servicio utilizará la biblioteca de AngularFire para interactuar con Firebase.
Ejemplo de servicio de autenticación:
import { Injectable } from '@angular/core';
import { AngularFireAuth } from '@angular/fire/auth';
@Injectable({
providedIn: 'root'
})
export class AuthService {
constructor(private afAuth: AngularFireAuth) {}
// Método para iniciar sesión y obtener el token
async login(email: string, password: string): Promise<string | null> {
const userCredential = await this.afAuth.signInWithEmailAndPassword(email, password);
const token = await userCredential.user?.getIdToken(); // Obtener el token
return token; // Devolver el token
}
}
import { Component } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { AuthService } from '../auth.service';
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.css']
})
export class LoginComponent {
loginForm: FormGroup;
constructor(private fb: FormBuilder, private authService: AuthService) {
this.loginForm = this.fb.group({
email: ['', [Validators.required, Validators.email]],
password: ['', [Validators.required, Validators.minLength(6)]]
});
}
async onSubmit() {
if (this.loginForm.valid) {
const { email, password } = this.loginForm.value;
try {
const token = await this.authService.login(email, password);
console.log('Inicio de sesión exitoso. Token:', token);
localStorage.setItem('token', token || ''); // Almacenar el token
} catch (error) {
console.error('Error al iniciar sesión:', error);
}
}
}
}
localStorage.setItem('token', token || '');
const token = localStorage.getItem('token');
const headers = new HttpHeaders({
Authorization: `Bearer ${token}`
});
// Realiza la llamada a la API
this.httpClient.get('https://api.example.com/secure-data', { headers }).subscribe(data => {
console.log('Datos seguros:', data);
});
Crear un interceptor.
ng generate interceptor auth
import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const token = localStorage.getItem('token');
if (token) {
const cloned = req.clone({
setHeaders: {
Authorization: `Bearer ${token}`
}
});
return next.handle(cloned);
}
return next.handle(req);
}
}
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { ReactiveFormsModule } from '@angular/forms';
import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
import { AngularFireModule } from '@angular/fire';
import { AngularFireAuthModule } from '@angular/fire/auth';
import { environment } from '../environments/environment';
import { AppComponent } from './app.component';
import { AuthInterceptor } from './auth.interceptor';
@NgModule({
declarations: [
AppComponent,
// Otros componentes...
],
imports: [
BrowserModule,
ReactiveFormsModule,
HttpClientModule, // Asegúrate de importar el módulo HTTP
AngularFireModule.initializeApp(environment.firebase),
AngularFireAuthModule
],
providers: [
{ provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true }
],
bootstrap: [AppComponent]
})
export class AppModule { }
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class ApiService {
private apiUrl = 'https://api.example.com';
constructor(private http: HttpClient) {}
getSecureData(): Observable<any> {
return this.http.get(`${this.apiUrl}/secure-data`);
}
}
import { Component, OnInit } from '@angular/core';
import { ApiService } from '../api.service';
@Component({
selector: 'app-secure-data',
templateUrl: './secure-data.component.html',
styleUrls: ['./secure-data.component.css']
})
export class SecureDataComponent implements OnInit {
data: any;
constructor(private apiService: ApiService) {}
ngOnInit() {
this.apiService.getSecureData().subscribe(
response => {
this.data = response;
console.log('Datos seguros:', this.data);
},
error => {
console.error('Error al obtener datos seguros:', error);
}
);
}
}
ng generate component login
- Abrir login.component.ts y añadir la lógica para manejar el formulario de inicio de sesión.
import { Component } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { AuthService } from '../auth.service';
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.css']
})
export class LoginComponent {
loginForm: FormGroup;
errorMessage: string | null = null;
constructor(private fb: FormBuilder, private authService: AuthService) {
this.loginForm = this.fb.group({
email: ['', [Validators.required, Validators.email]],
password: ['', [Validators.required, Validators.minLength(6)]]
});
}
async onSubmit() {
if (this.loginForm.valid) {
const { email, password } = this.loginForm.value;
try {
const token = await this.authService.login(email, password);
console.log('Inicio de sesión exitoso. Token:', token);
// Redirige o realiza acciones adicionales después del inicio de sesión
} catch (error) {
this.errorMessage = 'Error al iniciar sesión. Intente de nuevo.';
console.error('Error al iniciar sesión:', error);
}
}
}
}
<div class="login-container">
<h2>Iniciar Sesión</h2>
<form [formGroup]="loginForm" (ngSubmit)="onSubmit()">
<div>
<label for="email">Correo Electrónico</label>
<input id="email" formControlName="email" />
<div *ngIf="loginForm.get('email')?.invalid && loginForm.get('email')?.touched">
<small>El correo electrónico es inválido.</small>
</div>
</div>
<div>
<label for="password">Contraseña</label>
<input type="password" id="password" formControlName="password" />
<div *ngIf="loginForm.get('password')?.invalid && loginForm.get('password')?.touched">
<small>La contraseña es requerida.</small>
</div>
</div>
<button type="submit" [disabled]="loginForm.invalid">Iniciar Sesión</button>
<div *ngIf="errorMessage"></div>
</form>
</div>
import { Injectable } from '@angular/core';
import { AngularFireAuth } from '@angular/fire/auth';
@Injectable({
providedIn: 'root'
})
export class AuthService {
constructor(private afAuth: AngularFireAuth) {}
async login(email: string, password: string): Promise<string | null> {
const userCredential = await this.afAuth.signInWithEmailAndPassword(email, password);
const token = await userCredential.user?.getIdToken();
return token;
}
async logout(): Promise<void> {
await this.afAuth.signOut();
}
}
ng generate component logout
import { Component } from '@angular/core';
import { AuthService } from '../auth.service';
import { Router } from '@angular/router';
@Component({
selector: 'app-logout',
template: `<button (click)="onLogout()">Cerrar Sesión</button>`
})
export class LogoutComponent {
constructor(private authService: AuthService, private router: Router) {}
async onLogout() {
await this.authService.logout();
localStorage.removeItem('token'); // Elimina el token almacenado
this.router.navigate(['/login']); // Redirige al usuario a la página de login
}
}
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { LoginComponent } from './login/login.component';
import { LogoutComponent } from './logout/logout.component';
const routes: Routes = [
{ path: 'login', component: LoginComponent },
{ path: 'logout', component: LogoutComponent },
{ path: '', redirectTo: '/login', pathMatch: 'full' }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
Copiar código
ng generate guard auth
2. Implementar la lógica del guardián
- Abrir auth.guard.ts y añadir la lógica para verificar si el usuario está autenticado:
Copiar código
import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';
import { AuthService } from './auth.service'; // Asegúrate de que la ruta sea correcta
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate {
constructor(private authService: AuthService, private router: Router) {}
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): boolean {
const isAuthenticated = !!localStorage.getItem('token'); // Verifica si hay un token
if (!isAuthenticated) {
this.router.navigate(['/login']); // Redirige a login si no está autenticado
return false; // Bloquea el acceso
}
return true; // Permite el acceso
}
}
Ahora que has creado el guardián, debes aplicarlo a las rutas que deseas proteger.
Copiar código
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { LoginComponent } from './login/login.component';
import { SecureComponent } from './secure/secure.component'; // Un componente que deseas proteger
import { AuthGuard } from './auth.guard'; // Asegúrate de que la ruta sea correcta
const routes: Routes = [
{ path: 'login', component: LoginComponent },
{ path: 'secure', component: SecureComponent, canActivate: [AuthGuard] }, // Ruta protegida
{ path: '', redirectTo: '/login', pathMatch: 'full' }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }