来自存储的 Ionic 3 + HttpClientModule 和令牌

Pos*_*ans 5 ionic-framework angular-http-interceptors

我已经构建了一个拦截器,用于向 PHP 后端发出 HTTP 请求。这个后端为应用程序提供了一个 JWT 令牌,我将它保存在 Ionic Storage 中。但我想从 Storage 中获取该令牌并将其作为标头添加到 HTTP 请求中。

下面是我的拦截器和硬编码令牌。这有效,我得到了后端的响应。

见更新@这篇文章的底部

http-interceptor.ts

import { HttpInterceptor, HttpRequest } from '@angular/common/http/';
import {HttpEvent, HttpHandler} from '@angular/common/http';
import { AuthProvider } from "../providers/auth/auth";
import {Injectable} from "@angular/core";
import {Observable} from "rxjs/Observable";
import {Storage} from "@ionic/storage";

@Injectable()
export class TokenInterceptor implements HttpInterceptor {

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        const changedReq = req.clone({headers: req.headers.set('Authorization', 'Bearer MY TOKEN')});
        return next.handle(changedReq);
    }

}
Run Code Online (Sandbox Code Playgroud)

但是如何将令牌从存储中获取到标头中。我搜索了很多,大多数教程/示例都来自较旧的 HTTP 模块。如果有人有想法或有更新示例?

更新

OK 下面的代码发送令牌

intercept(req: HttpRequest<any>, next: HttpHandler) : Observable<HttpEvent<any>>{
        return fromPromise(this.Auth.getToken())
            .switchMap(token => {
                const changedReq = req.clone({headers: req.headers.set('Authorization', 'Bearer ' + token )});

                return next.handle(changedReq);
            });
    }
Run Code Online (Sandbox Code Playgroud)

有一个例外,即我第一次访问该页面:)

小智 6

对于像我一样遇到此问题并使用rxjs >=5.5.0的人,那么你可以这样做:

auth-interceptor.ts

@Injectable()
export class AuthInterceptor implements HttpInterceptor {

constructor(private authService: AuthService) { }

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    return from(this.authService.getToken()).pipe(mergeMap((token) => {
        const changedReq = req.clone({
            setHeaders: {
                Authorization: `Bearer ${token}`
            }
        });

        return next.handle(changedReq);
    }));
}
Run Code Online (Sandbox Code Playgroud)

auth-service.ts

public async getToken() {
    return await this.storage.get('ACCESS_TOKEN');
}
Run Code Online (Sandbox Code Playgroud)


Tom*_*vic 4

您可以将 JWT 令牌保存在localStorage等位置

 localStorage.setItem('myToken', res.token);
Run Code Online (Sandbox Code Playgroud)

然后通过访问它

localStorage.getItem('myToken');
Run Code Online (Sandbox Code Playgroud)

在你的情况下是这样的:

import { HttpInterceptor, HttpRequest } from '@angular/common/http/';
import {HttpEvent, HttpHandler} from '@angular/common/http';
import { AuthProvider } from "../providers/auth/auth";
import {Injectable} from "@angular/core";
import {Observable} from "rxjs/Observable";
import {Storage} from "@ionic/storage";

@Injectable()
export class TokenInterceptor implements HttpInterceptor {

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        const changedReq = req.clone({headers: req.headers.set('Authorization', localStorage.getItem('myToken'))});
        return next.handle(changedReq);
    }

}
Run Code Online (Sandbox Code Playgroud)

如果您想使用离子存储

import { HttpInterceptor, HttpRequest } from '@angular/common/http/';
    import {HttpEvent, HttpHandler} from '@angular/common/http';
    import { AuthProvider } from "../providers/auth/auth";
    import {Injectable} from "@angular/core";
    import {Observable} from "rxjs/Observable";
    import {Storage} from "@ionic/storage";

   @Injectable()
    export class TokenInterceptor implements HttpInterceptor {

    constructor(public _storage: Storage) {
         _storage.get('myToken').then((val) => {
         console.log('Your age is', val);
         });
    }

       intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
            const changedReq = req.clone({headers: req.headers.set('Authorization', this.val)});
            return next.handle(changedReq);
        }

    }
Run Code Online (Sandbox Code Playgroud)