Web tokens in Angular 2+

后端 未结 3 768
天涯浪人
天涯浪人 2020-12-11 11:02

I am sending a POST request to a back end REST API, via a login component. I get an x-auth token back in the response headers. How do I get and store this token so I can use

相关标签:
3条回答
  • 2020-12-11 11:47
    localStorage.setItem('token', response.access_token);
    

    This is how I did it with Angular 5:

    My LoginService:

    import { Injectable } from '@angular/core';
    import { HttpHeaders, HttpParams } from '@angular/common/http';
    
    import { HttpService } from '../services/http.service';
    
    @Injectable()
    export class LoginService{
        constructor(private _http: HttpService) {
        }
    
        login(user: string, pass: string) {
            const params = new HttpParams()
                .append('grant_type', 'password')
                .append('username', user)
                .append('password', pass);
            const headers = new HttpHeaders()
                .set('Content-Type', 'application/x-www-form-urlencoded');
            return this._http.post('login', params, { headers: headers });
        }
    }
    

    My Login Component:

    import { Component, OnInit } from '@angular/core';
    import { FormBuilder, FormGroup, Validators } from '@angular/forms';
    
    import { LoginService } from '../../services';
    
    @Component({
        selector: 'app-login',
        templateUrl: './login.component.html'
    })
    export class LoginComponent implements OnInit {
        public pageTitle = 'User login';
        errorMessage = '';
        loginFormGroup: FormGroup;
        constructor(
            private fb: FormBuilder,
            private _loginService: LoginService) { }
        ngOnInit() {
            this.formBuild();
        }
    
        formBuild() {
            this.loginFormGroup = this.fb.group({
                loginUser: ['', [Validators.required]],
                loginPass: ['', [Validators.required]],
            });
        }
    
        onLogin() {
            let response: any;
            this._loginService.login(this.loginFormGroup.value.loginUser, this.loginFormGroup.value.loginPass)
                .subscribe(
                    response => { response= response; },
                    error => { this.errorMessage = <any>error; },
                    () => {
    
                        localStorage.setItem('token', response.access_token);
                    });
        }
    }
    

    I keep my token in localeStorage.

    I have created interceptors for usage of this token:

    import { Injectable } from '@angular/core';
    import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HTTP_INTERCEPTORS } from '@angular/common/http';
    import { Observable } from 'rxjs/Observable';
    
    @Injectable()
    export class TokenInterceptor implements HttpInterceptor {
        intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
            const token = localStorage.getItem('token');
            request = request.clone({
                setHeaders: {
                    Authorization: `Bearer ${token}`
                }
            });
            return next.handle(request);
        }
    }
    
    export const TokenInterceptorProvider = {
        provide: HTTP_INTERCEPTORS,
        useClass: TokenInterceptor,
        multi: true
    };
    

    This solution fro Angular 5 and HTTPClient. If you need solution for only Angular 2 let me know, I will post that to you.

    0 讨论(0)
  • 2020-12-11 11:48

    Using NgCookie module you may set like:

      $cookies.put("token","your_response_val");
    

    After that for further use.... $cookies.get ()

    0 讨论(0)
  • 2020-12-11 11:54

    Store the token you are receiving in the local storage of the web browser and use an http interceptor to remove the token from all responses and add the token to all requests.

    0 讨论(0)
提交回复
热议问题