Angular Authenticaton Yapımı

Starzz

Üye
21 Haz 2015
238
58
Angular-logo.png

Merhaba dostlar. Bugün sizlere Angular kullanarak nasıl, Login ve Logout işlemleri yaparız, token nasıl kaydederiz ve bunları nasıl sistematik bir şekilde uygulamamıza ekleyebiliriz bunu anlatacağım.
Projeye başlamadan önce şunları belirtmek isterim. Ben UI için Angular Material kullandım. Kurulumunu burada anlatmayacağım. Konuda bir önem arzetmiyor. Siz farklı kütüphanelerde kullanabilirsiniz.​

Projemizi, komutu ile oluşturalım;
Bash:
ng new <project-name>

Login için yeni bir component oluşturalım. Bunun için aşşağıdaki kodu yazmanız gerekiyor.
Bash:
ng g c login

Oluşan dosyada login.component.html dosyasını buluyor ve içerisini düzenlemeye başlıyorum.

HTML:
<!--login.component.html-->

<div fxFill fxLayout="column" fxLayoutAlign="center center" fxLayoutGap="1.5rem" class="mat-typography">
  <div class="login-container" fxLayout="row" fxLayoutAlign="center">
    <mat-card fxFlex="90%" fxFlex.sm="66%" fxFlex.md="50%" fxFlex.gt-md="33%" class="login-box">
      <form (ngSubmit)="login()" [formGroup]="loginForm" novalidate>
        <div class="login-error" [hidden]="!error || isLoading" translate>
          Username or password incorrect.
        </div>
        <br />
        <div class="login-fields" fxLayout="column">
          <mat-form-field [hideRequiredMarker]="true">
            <input type="text" matInput formControlName="username" autocomplete="username"
              [placeholder]="Kullanıcı Adı" required />
            <mat-error *ngIf="loginForm.controls.username.invalid && loginForm.controls.username.touched">
              <span translate>Kullanıcı Adı giriniz</span>
            </mat-error>
          </mat-form-field>
          <mat-form-field [hideRequiredMarker]="true">
            <input type="password" matInput formControlName="password" autocomplete="current-password"
              [placeholder]="Şifre" required />
            <mat-error *ngIf="loginForm.controls.password.invalid && loginForm.controls.password.touched">
              <span translate>Şifre giriniz</span>
            </mat-error>
          </mat-form-field>
          <mat-slide-toggle color="primary" formControlName="remember" translate>Beni hatırla</mat-slide-toggle>
          <br />
          <button mat-raised-button color="primary" type="submit" [disabled]="loginForm.invalid || isLoading">
            <app-loader class="inline-loader" [isLoading]="isLoading"></app-loader>
            <span translate>Giriş</span>
          </button>
        </div>
      </form>
    </mat-card>
  </div>
</div>

Burada yaptığımız şey iki adet input ve bir submit. Ben ngx-rocket paketini kullandığım için bana login tasarımını otomatik veriyor. Bu gözünüze gelen karışıklığın sebebi ondan. Ancak burada önemli olan html değil konunun devamı.

Şimdi login.component.ts dosyasına geliyorum ve kodlarımı yazıyorum.

JavaScript:
import { Component, OnInit, OnDestroy } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
import { finalize } from 'rxjs/operators';
import { Injectable } from '@angular/core';
import { Observable, of } from 'rxjs';
import { HttpClient } from '@angular/common/http';


export interface Credentials {
  // Customize received credentials here
  username: string;
  token: string;
  role: string;
  id: number;
}

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.scss']
})
export class LoginComponent implements OnInit, OnDestroy {
  loginForm!: FormGroup;
  isLoading = false;

  constructor(
    private router: Router,
    private route: ActivatedRoute,
    private formBuilder: FormBuilder
  ) {
    this.createForm(); //html'de yazdığım inputlar için bir form oluşturuyorum.
  }

  ngOnInit() { }

  ngOnDestroy() { }

  login() {
    //form submit olunca bu fonksiyon tetikleniyor.
    this.isLoading = true;
    const login$ = this.authLogin(this.loginForm.value); //form bilgilerini authLogin fonksiyonuna atıyorum
    login$
      .pipe(
        finalize(() => {
          this.loginForm.markAsPristine();
          this.isLoading = false;
        }),
        untilDestroyed(this)
      ).subscribe(
        credentials => {
          console.log(`${credentials.username} successfully logged in`)
        },
        error => {
          console.warn(`Login error: ${error}`);
        }
      );
  }

  authLogin(context: LoginContext)Observable<Credentials> {
      //burada ise backend'ime istek atıyorum
    return this.http.post<Credentials>('http://localhost:5001/api/Login', context).pipe(tap(
      data => {
          //gelen bilgileri setCredentials fonksiyonuna atıp, bilgileri kaydedicem.
        this.setCredentials(data, context.remember);
      }
    ));
  }
 
  setCredentials(credentials?: any, remember?: boolean) {
    this._credentials = credentials || null;

    if (credentials) {
      const storage = remember ? localStorage : sessionStorage;
      storage.setItem(credentialsKey, JSON.stringify(credentials));
        //bazı kontrolleri sağladıktan sonra bu bilgileri stroge kaydedip daha sonra projemde kullanıcam
        //artık login olduk
    } else {
      sessionStorage.removeItem(credentialsKey);
      localStorage.removeItem(credentialsKey);
        //eğer bilgilerimiz doğru değil ise session kill ediyor ve giriş sağlayamıyorsunuz.
    }
  }

  private createForm() {
     //en üstte oluşturduğum formun kodları
    this.loginForm = this.formBuilder.group({
      username: ['', Validators.required],
      password: ['', Validators.required],
      remember: true
    });
  }
}

Yazdığım kodlar bu şekilde. Açıklamalarını yorum satırı olarak koda iliştirdim. Kısaca özet geçecek olursak;


1. form submit olunca login fonksiyonuna gitti ve authLogin fonksiyonuna gitti
2. Burada gerekli kontrolleri sağlayıp credentials fonksiyonuna yolluyorum.
3. Credentials fonksiyonunda amacım giriş bilgilerin doğruluğunu kontrol edip login bilgilerini kaydetmek veya kill etmek.

Bu yazımda amacım size adım adım öğretmek değil Angular kullananlar için bu framework'ü bizler için cazip kılan yönlerini göstermeye çalışmak. Aslında burada birden fazla service ayırarak daha güzel bir görüntü oluşturabilirdik ancak işin kolayına kaçıp tek bir yerde birleştirmeyi tercih ettim.

Akılınızda umarım Login hakkında bazı soru işaretlerini gidermeyi başarmışımdır. Sorularınızı yazmaktan çekinmeyin.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.