keycloak-angular 拦截器未发送授权 header
keycloak-angular interceptor not sending authorization header
我正在尝试将 keycloak-angular 集成到我的 angular 应用程序中。
身份验证流程运行良好,但是当我向我的 django api 发出请求时,我得到了 403。 HTTP_AUTHORIZATION header 丢失了,我不明白为什么。当我在我的 http 服务中硬编码 header 时,它起作用了。
这是图书馆:
这是我的密钥斗篷配置
// utility/app.init.ts
import { KeycloakService } from 'keycloak-angular';
export function initializeKeycloak(keycloak: KeycloakService): () => Promise<boolean> {
return () =>
keycloak.init({
config: {
url: 'http://sso.portal.ca/auth',
realm: 'kedi',
clientId: 'account'
},
bearerPrefix: 'Bearer',
initOptions: {
onLoad: 'login-required', // redirects to the login page
checkLoginIframe: true,
checkLoginIframeInterval: 1000
}
});
}
这是我的应用模块
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { NgModule, APP_INITIALIZER } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
import { CoreModule } from './@core/core.module';
import { ThemeModule } from './@theme/theme.module';
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import {
NbChatModule,
NbDatepickerModule,
NbDialogModule,
NbMenuModule,
NbSidebarModule,
NbToastrModule,
NbWindowModule,
} from '@nebular/theme';
import { KeycloakAngularModule, KeycloakService, KeycloakBearerInterceptor } from 'keycloak-angular';
import { initializeKeycloak} from '../app/utility/app.init'
@NgModule({
declarations: [AppComponent],
imports: [
BrowserModule,
BrowserAnimationsModule,
HttpClientModule,
AppRoutingModule,
NbSidebarModule.forRoot(),
NbMenuModule.forRoot(),
NbDatepickerModule.forRoot(),
NbDialogModule.forRoot(),
NbWindowModule.forRoot(),
NbToastrModule.forRoot(),
CoreModule.forRoot(),
ThemeModule.forRoot(),
KeycloakAngularModule,
],
bootstrap: [AppComponent],
providers: [
{
provide: APP_INITIALIZER,
useFactory: initializeKeycloak,
multi: true,
deps: [KeycloakService]
},
{
provide: HTTP_INTERCEPTORS,
useClass: KeycloakBearerInterceptor,
multi: true
}
]
})
export class AppModule {
}
这是我的 api 服务
import { Injectable } from '@angular/core';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
import {
HttpClient,
HttpHeaders,
HttpErrorResponse,
} from '@angular/common/http';
@Injectable({
providedIn: 'root'
})
export class PortalService {
// change later
apiUrl: string = 'http://api.portal.ca/public';
constructor(private http: HttpClient) { }
getUrl(uri: string) {
return `${this.apiUrl}/${uri}`;
}
getPartnersTableStructure() {
return this.http.get(this.getUrl('partner/table_config/'));
}
getPartners() {
return this.http.get(this.getUrl('partner'));
}
getEDIDocuments() {
return this.http.get(this.getUrl('edi_document'));
}
getEDIDocumentsTableStructure() {
return this.http.get(this.getUrl('edi_document/table_config'));
}
}
如果需要更多信息,请告诉我谢谢
您似乎缺少配置行,请查看 https://www.npmjs.com/package/keycloak-angular#httpclient-interceptor。 enableBearerInterceptor: true 将为您添加拦截器。
我不知道你是否需要那条线,因为它默认处于活动状态。
另一个问题可能是 (需要深入了解代码,但这纯粹是推测)如果未在 module/submodules 中添加令牌,其中 HttpClient发出请求,然后它不会在 http 调用中添加令牌。
我错过了 silent-check-sso.html
当我添加文件时它才开始工作
<html>
<body>
<script>
parent.postMessage(location.href, location.origin);
</script>
</body>
</html>
我正在尝试将 keycloak-angular 集成到我的 angular 应用程序中。 身份验证流程运行良好,但是当我向我的 django api 发出请求时,我得到了 403。 HTTP_AUTHORIZATION header 丢失了,我不明白为什么。当我在我的 http 服务中硬编码 header 时,它起作用了。
这是图书馆:
这是我的密钥斗篷配置
// utility/app.init.ts
import { KeycloakService } from 'keycloak-angular';
export function initializeKeycloak(keycloak: KeycloakService): () => Promise<boolean> {
return () =>
keycloak.init({
config: {
url: 'http://sso.portal.ca/auth',
realm: 'kedi',
clientId: 'account'
},
bearerPrefix: 'Bearer',
initOptions: {
onLoad: 'login-required', // redirects to the login page
checkLoginIframe: true,
checkLoginIframeInterval: 1000
}
});
}
这是我的应用模块
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { NgModule, APP_INITIALIZER } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
import { CoreModule } from './@core/core.module';
import { ThemeModule } from './@theme/theme.module';
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import {
NbChatModule,
NbDatepickerModule,
NbDialogModule,
NbMenuModule,
NbSidebarModule,
NbToastrModule,
NbWindowModule,
} from '@nebular/theme';
import { KeycloakAngularModule, KeycloakService, KeycloakBearerInterceptor } from 'keycloak-angular';
import { initializeKeycloak} from '../app/utility/app.init'
@NgModule({
declarations: [AppComponent],
imports: [
BrowserModule,
BrowserAnimationsModule,
HttpClientModule,
AppRoutingModule,
NbSidebarModule.forRoot(),
NbMenuModule.forRoot(),
NbDatepickerModule.forRoot(),
NbDialogModule.forRoot(),
NbWindowModule.forRoot(),
NbToastrModule.forRoot(),
CoreModule.forRoot(),
ThemeModule.forRoot(),
KeycloakAngularModule,
],
bootstrap: [AppComponent],
providers: [
{
provide: APP_INITIALIZER,
useFactory: initializeKeycloak,
multi: true,
deps: [KeycloakService]
},
{
provide: HTTP_INTERCEPTORS,
useClass: KeycloakBearerInterceptor,
multi: true
}
]
})
export class AppModule {
}
这是我的 api 服务
import { Injectable } from '@angular/core';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
import {
HttpClient,
HttpHeaders,
HttpErrorResponse,
} from '@angular/common/http';
@Injectable({
providedIn: 'root'
})
export class PortalService {
// change later
apiUrl: string = 'http://api.portal.ca/public';
constructor(private http: HttpClient) { }
getUrl(uri: string) {
return `${this.apiUrl}/${uri}`;
}
getPartnersTableStructure() {
return this.http.get(this.getUrl('partner/table_config/'));
}
getPartners() {
return this.http.get(this.getUrl('partner'));
}
getEDIDocuments() {
return this.http.get(this.getUrl('edi_document'));
}
getEDIDocumentsTableStructure() {
return this.http.get(this.getUrl('edi_document/table_config'));
}
}
如果需要更多信息,请告诉我谢谢
您似乎缺少配置行,请查看 https://www.npmjs.com/package/keycloak-angular#httpclient-interceptor。 enableBearerInterceptor: true 将为您添加拦截器。
我不知道你是否需要那条线,因为它默认处于活动状态。
另一个问题可能是 (需要深入了解代码,但这纯粹是推测)如果未在 module/submodules 中添加令牌,其中 HttpClient发出请求,然后它不会在 http 调用中添加令牌。
我错过了 silent-check-sso.html
当我添加文件时它才开始工作
<html>
<body>
<script>
parent.postMessage(location.href, location.origin);
</script>
</body>
</html>