【问题标题】:Keycloak with Angular and Spring error: GET http://localhost:8180/auth/realms/Storage/protocol/openid-connect/3p-cookies/step1.html 404 (Not Found)带有 Angular 和 Spring 错误的 Keycloak:GET http://localhost:8180/auth/realms/Storage/protocol/openid-connect/3p-cookies/step1.html 404(未找到)
【发布时间】:2020-11-16 13:56:21
【问题描述】:

我正在尝试将 Keycloak 与 Spring Boot 和 Angular 集成。

安全工作正常。当我尝试通过浏览器手动访问安全端点localhost:8080/products/1(产品是我的数据库中的实体),然后我被重定向到 Keycloak 登录客户端,登录后我可以访问端点.

我一直在关注这个tutorial

当我尝试访问localhost:4200 (Angular 应用程序主页) 时出现问题,在浏览器控制台中我收到此错误:

keycloak.js:1305 GET http://localhost:8180/auth/realms/Storage/protocol/openid-connect/3p-cookies/step1.html 404 (Not Found)

弹簧配置文件: application-local.yml

keycloak:
  auth-server-url: 'http://localhost:8180/auth'
  realm: 'Storage'
  resource: 'storage-app-client'
  public-client: true
  principal-attribute: test123

其余配置文件取自上述教程。

Keycloak 领域:

Angular 中的 Keycloak 初始化:

@Injectable({
  providedIn: 'root'
})
export class KeycloakService
{
  private keycloakAuth: KeycloakInstance;

  constructor()
  {
  }

  init(): Promise<any>
  {
    return new Promise((resolve, reject) =>
    {
      const config = {
        'url': 'http://localhost:8180/auth',
        'realm': 'Storage',
        'clientId': 'storage-app-client'
      };
      // @ts-ignore
      this.keycloakAuth = new Keycloak(config);
      this.keycloakAuth.init({onLoad: 'login-required'})
        .success(() =>
        {
          resolve();
        })
        .error(() =>
        {
          reject();
        });
    });
  }

  getToken(): string
  {
    return this.keycloakAuth.token;
  }

  logout()
  {
    const options = {
      'redirectUri': 'http://localhost:4200',
      'realm': 'Storage',
      'clientId': 'storage-app-client'
    };
    this.keycloakAuth.logout(options);
  }
}

app.module.ts

import {BrowserModule} from '@angular/platform-browser';
import {APP_INITIALIZER, NgModule} from '@angular/core';

import {AppComponent} from './app.component';
import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
import {HTTP_INTERCEPTORS, HttpClient, HttpClientModule} from "@angular/common/http";
import {MatSliderModule} from '@angular/material/slider';
import {MatToolbarModule} from '@angular/material/toolbar';
import {MatIconModule} from '@angular/material/icon';
import {RouterModule} from '@angular/router';
import {NavbarComponent} from './components/navbar/navbar.component';
import {MainContentComponent} from './components/main-content/main-content.component';
import {ProductComponent} from './components/products/product/product.component';
import {HomeComponent} from './components/home/home.component';
import {ProductGroupComponent} from './components/productGroups/productGroup/product-group.component';
import {FooterComponent} from './components/footer/footer.component';
import {MatTableModule} from "@angular/material/table";
import {MatButtonModule} from "@angular/material/button";
import {MatPaginatorModule} from "@angular/material/paginator";
import {ProductUpdateComponent} from './components/products/product-update/product-update.component';
import {MatFormFieldModule} from "@angular/material/form-field";
import {FormsModule, ReactiveFormsModule} from "@angular/forms";
import {MatInputModule} from "@angular/material/input";
import {ProductCreateComponent} from './components/products/product-create/product-create.component';
import {MatSortModule} from "@angular/material/sort";
import {ProductGroupUpdateComponent} from './components/productGroups/product-group-update/product-group-update.component';
import {ProductGroupCreateComponent} from './components/productGroups/product-group-create/product-group-create.component';
import {MatExpansionModule} from "@angular/material/expansion";
import {MatSelectModule} from "@angular/material/select";
import {LogoutComponent} from "./components/logout/logout.component";
import {KeycloakService} from "./services/keycloak-service.service";
import {TokenInterceptor} from "./interceptors/token-interceptor";

export function kcFactory(keycloakService: KeycloakService) {
  return () => keycloakService.init();
}

@NgModule({
  declarations: [
    AppComponent,
    NavbarComponent,
    MainContentComponent,
    ProductComponent,
    HomeComponent,
    ProductGroupComponent,
    FooterComponent,
    ProductUpdateComponent,
    ProductCreateComponent,
    ProductGroupUpdateComponent,
    ProductGroupCreateComponent,
    LogoutComponent
  ],
  imports: [
    BrowserModule,
    BrowserAnimationsModule,
    HttpClientModule,
    MatSliderModule,
    MatToolbarModule,
    MatIconModule,
    RouterModule.forRoot([
      {path: '', component: HomeComponent},
      {path: 'products/update/:id', component: ProductUpdateComponent},
      {path: 'products/add', component: ProductCreateComponent},
      {path: 'groups', component: ProductGroupComponent},
      {path: 'groups/add', component: ProductGroupCreateComponent},
      {path: 'groups/update/:id', component: ProductGroupUpdateComponent},
      {path: 'logout', component: LogoutComponent},
    ]),
    MatTableModule,
    MatButtonModule,
    MatPaginatorModule,
    MatFormFieldModule,
    ReactiveFormsModule,
    MatInputModule,
    MatSortModule,
    MatExpansionModule,
    MatSelectModule,
    FormsModule
  ],
  providers: [KeycloakService,
    {
      provide: APP_INITIALIZER,
      useFactory: kcFactory,
      deps: [KeycloakService],
      multi: true
    },
    {
      provide: HTTP_INTERCEPTORS,
      useClass: TokenInterceptor,
      multi: true
    }],
  bootstrap: [AppComponent]
})
export class AppModule {
}

Keycloak 客户端

【问题讨论】:

  • 您是否与 keycloak-angular javascript 适配器集成并在 angular 端初始化了 keycloak 配置?
  • 将其发布在您的问题中,以及 app.module.ts
  • 还有你的 Angular 客户端配置关闭 keycloak 的截图
  • 遇到同样的问题(今天)。我在这个客户端旁边运行了另一个应用程序,它运行良好,但是一个单独的 Angular 应用程序(不同版本的 keycloak-angular 请注意)遇到了完全相同的错误。
  • 我在较新的 Angular 应用程序中降级为 keycloak-angular 7.3.1 并且错误消失了。我以前有 8.0.1。我最终将在 8.0.1 上进行更多测试,但这暂时让我畅通无阻。可能与我的 keycloak 版本和 Angular 库不兼容。

标签: angular spring spring-boot spring-security keycloak


【解决方案1】:

我感觉到你的痛苦。我今天正在关注本教程,但遇到了同样的 GET 404 错误:

https://dev.to/anjnkmr/keycloak-integration-in-angular-application-5a43

错误来自 keycloak-js 包。经过几个小时的尝试查找原因后,我检查了 keycloak-js 的发布版本,发现新版本 11 已在 6 天前发布(并且我正在使用)。

我为 keycloak-js 包切换到版本 10.0.2

总结如下:

keycloak:10.0.1

keycloak-js:10.0.2

keycloak-angular: 8.0.1(如果你使用的话)

angular: 10**(拼命的把angular从9升级到了10,不知道有没有影响)

因此对我来说是新版本的 keycloak-js 包造成了所有的麻烦。

我建议你尝试将 keycloak-js 的版本降级到 10.0.2

【讨论】:

    【解决方案2】:

    尝试通过路径 /auth/js/keycloak.js 使用来自您的 keycloak 服务器的 keycloak.js 版本

    该库可以直接从位于 /auth/js/keycloak.js 的 Keycloak 服务器检索,也可以作为 ZIP 存档分发。

    最佳实践是直接从 Keycloak 服务器加载 JavaScript 适配器,因为它会在您升级服务器时自动更新。如果您将适配器复制到 Web 应用程序,请确保仅在升级服务器后升级适配器。

    您可以参考this了解更多详情。

    【讨论】:

      【解决方案3】:

      我也面临同样的情况。我使用了服务器上的 keycloak.js,我的应用程序正在响应。

      在索引 html 中

      <script src="https://sso-blabla.com/auth/js/keycloak.js"></script>
      

      然后在下面的反应应用中使用它

      const Keycloak = window.Keycloak;
      

      我不确定这是最好的方法。但我是这样使用的,因为它只是一个 POC。

      【讨论】:

        【解决方案4】:

        在极少数情况下,Keycloak URL 可能像我之前所做的那样是错误的。因此,您指定 http://localhost:8282/keycloak/auth 而不是 http://localhost:8282/auth

        【讨论】:

          【解决方案5】:

          我得到了同样的错误,问题与前端无关,而是与 keycloak 的后端版本有关。在我替换了用于 keycloak 的基本图像后,它解决了问题:

          在这种情况下,我在 package.json 中使用:

          "keycloak-angular": "^8.4.0",
          "keycloak-js": "^15.0.2",
          

          和 13.0.1 版本的 keycloak。

          【讨论】:

          • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
          • 您是否降级了您的 keycloak 版本?如果是,您之前使用的是哪个版本
          【解决方案6】:
          1. 更新 package.json

          "keycloak-angular": "^8.4.0"

          "keycloak-js": "^15.1.0"

          1. 执行

          npm install

          1. 执行

          ng serve

          成功!!!!

          【讨论】:

          • 不匹配的双引号
          猜你喜欢
          • 2020-05-13
          • 2022-12-22
          • 2017-06-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-23
          • 2019-06-13
          • 2015-12-04
          • 1970-01-01
          相关资源
          最近更新 更多