【发布时间】:2020-12-17 21:37:56
【问题描述】:
我正在开发我的第一个 Ionic 应用程序,并且已经完成了身份验证部分。
但是经过身份验证后,当我使用 HttpClientModule 发出请求时,它的标头上没有令牌,并且我从我在 .net Core 中制作的 API 得到 401。
我已经阅读了很多关于这个主题的帖子,但似乎没有解决方案可以解决这个问题。
我认为问题不在于 API,因为如果您在标头上有不记名令牌,它适用于邮递员。
这是我的 app.module.ts 配置:
import { AuthModule } from './auth/auth.module';
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy } from '@angular/router';
import { IonicModule, IonicRouteStrategy } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import { IonicStorageModule, Storage } from '@ionic/storage';
import { JwtModule, JWT_OPTIONS } from '@auth0/angular-jwt';
export function getAuthScheme(request) {
return 'Bearer ';
}
export function jwtOptionsFactory(storage) {
return {
tokenGetter: () => {
return storage.get('ACCESS_TOKEN');
},
authScheme: getAuthScheme,
whitelistedDomains: ['localhost:44326', 'https://localhost:44326', 'https://localhost:44326/', 'localhost']
};
}
@NgModule({
declarations: [AppComponent],
entryComponents: [],
imports: [
BrowserModule,
IonicModule.forRoot(),
AppRoutingModule,
AuthModule,
IonicStorageModule.forRoot(),
JwtModule.forRoot({
jwtOptionsProvider: {
provide: JWT_OPTIONS,
useFactory: jwtOptionsFactory,
deps: [Storage],
},
}),
],
providers: [
StatusBar,
SplashScreen,
{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
],
bootstrap: [AppComponent],
})
export class AppModule {}
我在创建应用程序时检查了使用 cordova 选项。或许与此有关?
更新: 所以,我已经像 Ronny 所说的那样实现了一个拦截器,但是授权头仍然没有出现。
app.mmodule.ts 和以前一样,但是有这个提供程序:
providers: [
{ provide: HTTP_INTERCEPTORS, useClass: JwtInterceptorProvider, multi: true },
{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
StatusBar,
SplashScreen,
],
这是我的拦截器类:
import { Storage } from '@ionic/storage';
import {
HttpInterceptor,
HttpRequest,
HttpHandler,
HttpEvent,
} from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root',
})
export class JwtInterceptorProvider implements HttpInterceptor {
constructor(private storage: Storage) {
console.log(`Hello from JwtInterceptor`);
}
intercept(
request: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any>> {
this.storage.get('ACCESS_TOKEN').then((token) => {
if (token) {
const clonedRequest = this.addToken(request, token);
return next.handle(clonedRequest);
}
});
return next.handle(request);
}
private addToken(request: HttpRequest<any>, token: any) {
if (token) {
console.log(`*******************************************************`);
console.log(`Bearer ${token}`);
const headers = {
Authorization: `Bearer ${token}`,
};
if (request.responseType === 'json') {
console.log('Json request.');
headers['Content-Type'] = 'application/json';
}
console.log('Header added.');
console.log(`*******************************************************`);
return request;
}
}
}
它在控制台中显示“已添加标题”。所以它达到了代码。但是标头不会出现在最终请求中。我觉得应用程序中的某些内容在此之后覆盖了标题。 我现在真的很困惑。我很欣赏任何想法。
【问题讨论】:
标签: angular typescript ionic-framework jwt