JWT与Angular和SpringBoot

时间:2018-08-02 13:13:50

标签: spring angular spring-boot jwt

我想在连接到Spring Boot后端的当前Angular应用程序中集成JWT身份验证。

我静静地浏览了许多教程,但是由于它们已连接到Auth0,因此大多数教程都不适合。我想自己处理用户管理。

我找到了这个例子:

角度:https://medium.com/@juliapassynkova/angular-springboot-jwt-integration-p-1-800a337a4e0

Spring Boot:https://medium.com/@nydiarra/secure-a-spring-boot-rest-api-with-json-web-token-reference-to-angular-integration-e57a25806c50

不幸的是,这个Angular前端是Angular 4,我已经在使用Angular 6。他们使用与Angular 6不兼容的'angular2-jwt'。我必须使用'auth0 / angular-jwt'。

我的问题是,在使用登录表单后,浏览器再次打开一个登录弹出窗口以登录后端。但是,即使拥有正确的凭据,也无法正常工作。我猜想,请求中缺少某些凭据。在app.module.ts中有2个旧的angular2-jwt代码,我不知道如何将其升级到auth0 / angular-jwt

export function authHttpServiceFactory(http: Http) {
  return new AuthHttp(new AuthConfig({
    headerPrefix: 'Bearer',
    tokenName: TOKEN_NAME,
    globalHeaders: [{'Content-Type': 'application/json'}],
    noJwtError: false,
    noTokenScheme: true,
    tokenGetter: (() => localStorage.getItem(TOKEN_NAME))
  }), http);
}

providers: [
    {provide: AuthHttp, useFactory: authHttpServiceFactory, deps: [Http]},
]

有人可以帮助我解决此问题。可能是我猜错了,可能还有其他原因吗?

边注;我只是更改了前端,但尝试从该示例连接到后端。如果我在示例中同时使用前端和后端,则可以正常工作。

1 个答案:

答案 0 :(得分:1)

几个月前,我已经成功地从angular2-jwt迁移到auth0 / angular-jwt。这样做时要记住的是:

  • auth0 / angular-jwt使用新的Angular HttpClient库,因此,如果要使用它,则必须将所有应用程序迁移到该库(我还是建议这样做,新库非常不错)
  • 新的angular-jwt使用HttpInterceptors-这使您可以将JWT直接附加到HttpClient过滤器链。因此,您不必在上面迁移代码。您必须将其完全删除并替换为拦截器初始化:(来自auth0 / angular-jwt文档的copy-paste):

    import { JwtModule } from '@auth0/angular-jwt';
    import { HttpClientModule } from '@angular/common/http';
    
    export function tokenGetter() {
      return localStorage.getItem('access_token');
    }
    
    @NgModule({
      bootstrap: [AppComponent],
      imports: [
        // ...
        HttpClientModule,
        JwtModule.forRoot({
          config: {  
            tokenGetter: tokenGetter,  
            whitelistedDomains: ['localhost:3001'],  
            blacklistedRoutes: ['localhost:3001/auth/']  
          }  
        })  
      ]  
    })  
    export class AppModule {}
    

请记住在根模块中应用此代码-然后使用HttpClient而不进行任何更改,拦截器将自动应用JWT。如果出现问题-怪罪白名单域/黑名单路由。这些字段目前实施得很差,并导致正则表达式等出现问题。
由于迁移不是一件容易的事,并且花了我很多时间,请随时询问。我很可能会知道答案。