DEV Community

Juraj Chovan
Juraj Chovan

Posted on

Autentifikácia v Ionic (ver.5) aplikácii cez REST API (4.časť) - odhlásenie

V prvej časti sú informácie o tom, aké sú REST API volania a čo (v prípade úspechu) vracajú.
V druhej časti je postup ako vytvoriť funkcionalitu "Registrácia" v Ionic (ver.5) aplikácii.
V tretej časti je postup ako implementovať funkcionalitu "Prihlásenie". A v tejto časti to bude funkcionalita "Odhlásenie"

V servise "auth" (tj.v súbore "../services/auth.service.ts") definujem funkciu "logout", cez ktorú sa obraciam na požadované REST API rozhranie:

  ...
  // logout prihlaseneho pouzivatela:
  logout({headers: headers}) {
    const token = localStorage.getItem('token');
    return this.http.post(`${this.url}/logout`, 'body', { headers });
  }

Enter fullscreen mode Exit fullscreen mode

Tlačítko [Logout] bude na stránke "Home" a objaví sa len vtedy ak bude momentálne používateľ prihlásený. Ak nebude prihlásený, bude tam dvojica tlačítok [Register] a [Login].
Aby to takto fungovalo, musím upraviť kód v súbore stránky "home.page.html" takto:

<ion-header [translucent]="true">
  <ion-toolbar>
    <ion-title>
      Ionic app
    </ion-title>
  </ion-toolbar>
</ion-header>

<ion-content [fullscreen]="true">
  <ion-header collapse="condense">
    <ion-toolbar>
      <ion-title size="large">Blank</ion-title>
    </ion-toolbar>
  </ion-header>

  <div id="container">
    <div *ngIf="loggedUser; else noLoggedUser">
      <strong>Moja Ionic app</strong>
      <div class="button-container">
        <ion-button (click)="logout()">Logout</ion-button>
      </div>
    </div>
    <ng-template #noLoggedUser>
      <strong>Moja Ionic app</strong>
      <div class="button-container">
        <ion-button (click)="goToRegisterPage()">Register</ion-button>
        <ion-button (click)="goToLoginPage()">Login</ion-button>
      </div>
    </ng-template>
  </div>

</ion-content>
Enter fullscreen mode Exit fullscreen mode

Stlačením Logout sa volá funkcia "logout()", ktorú je potrebné doplniť so súboru logiky stránky "home.page.ts":

import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Component } from '@angular/core';
import {NavController} from '@ionic/angular';
import { AlertController, LoadingController, ToastController } from '@ionic/angular';
import { Router } from '@angular/router';
import { AuthService } from 'src/app/services/auth.service';

@Component({
  selector: 'app-home',
  templateUrl: 'home.page.html',
  styleUrls: ['home.page.scss'],
})
export class HomePage {

  loggedUser = localStorage.getItem('token');

  constructor(
    private navCtrl: NavController,
    private loadingCtrl: LoadingController,
    private router: Router,
    private authService: AuthService,
    private alertCtrl: AlertController,
    private toastCtrl: ToastController,
  ) {}
  // prejst na prihlasovaci formular:
  goToLoginPage() {
    this.navCtrl.navigateForward('login');
  }
  // prejst na registracny formular:
  goToRegisterPage() {
    this.navCtrl.navigateForward('register');
  }

  // odhlasenie:
  // async logout() {
  async logout() {
    console.log('logged out ...');
    const loading = await this.loadingCtrl.create({
      message: 'Logging out ...'
    });
    await loading.present();
    const token = localStorage.getItem('token');
    let headers = new HttpHeaders({
      Authorization: 'Bearer '+token,
    });
    this.authService.logout({headers: headers}).subscribe(
      // ak je uspesne odhlasenie:
      async () => {
        const toast = await this.toastCtrl.create({
          message: 'User logged out',
          duration: 2000,
          color: 'dark'
        });
        await toast.present();
        loading.dismiss();
        // vymaze "token" z aplikacneho storage:
        localStorage.removeItem('token');
        // presmeruje na "home" stranku:
        await this.router.navigateByUrl('/');
        // reload-ne "home" stranku:
        location.reload();
      },
       // ak sa vyskytla nejaka chyba:
      async () => {
        const alert = await this.alertCtrl.create({
          message: 'There is an error',
          buttons: ['OK']
        });
        loading.dismiss();
        await alert.present();
      }
    );
  }
}
Enter fullscreen mode Exit fullscreen mode

Ak si dám teraz zobraziť domovskú stránku "home", tj.URL:

http://localhost:8100/home
Enter fullscreen mode Exit fullscreen mode

zobrazí sa (ak nie je používateľ prihlásený):

Image description
cez [Login] sa dostanem na prihlasovací formulár "Login", kde vložiť správne prihlasovacie údaje:

Image description
a pokračovať cez [Login], čo vykoná prihlásenie a presmeruje na domovskú stránku "Home", ktorú ešte refrešne aby bolo zobrazené iba tlačítko [Logout]:

Image description
Ak sa chce teraz prihlásený používateľ odhlásiť, tak na tejto domovskej stránke "Home" kliknúť na [Logout], čo vykoná odhlásenie používateľa a opäť presmeruje na domovskú stránku "Home", ktorú ešte refrešne aby boli zobrazené tlačítka [Register] a [Login]:

Image description
Pri odhlasovaní je dôležité volať POST request s informáciou v "header", kde je uvedený aktuálny token (ohlásiť možno len aktuálne prihláseného používateľa, tj.takého, ktorý má správny token) a tiež typ autentifikácie (tj."Bearer").
...

Heroku

This site is built on Heroku

Join the ranks of developers at Salesforce, Airbase, DEV, and more who deploy their mission critical applications on Heroku. Sign up today and launch your first app!

Get Started

Top comments (0)

Heroku

This site is powered by Heroku

Heroku was created by developers, for developers. Get started today and find out why Heroku has been the platform of choice for brands like DEV for over a decade.

Sign Up

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay