【问题标题】:How to pass dependencies to @auth0-angular-jwt?如何将依赖项传递给@auth0-angular-jwt?
【发布时间】:2017-07-31 00:06:24
【问题描述】:

所以...我正在迁移使用 HttpModuleangular2-jwt 库的“旧”代码。

之前,我可以让angular2-jwt 使用以下配置:

export function authHttpServiceFactory(
  http: Http, options: RequestOptions, myService: MyService) {

  return new AuthHttp(new AuthConfig({
    globalHeaders: [{'Content-Type': 'application/json'}],
    noJwtError: true,
    tokenGetter: (() => myService.get('my_token'))
  }), http, options);
}

@NgModule({
  providers: [
    {
      provide: AuthHttp,
      useFactory: authHttpServiceFactory,
      deps: [Http, RequestOptions, MyService]
    }
  ]
})
export class AuthModule {}

...但是现在,要与新的HttpClientModule 一起使用,我必须使用angular2-jwt 版本(@auth-angular-jwt - 我知道它仍处于测试版中 版本),我试图弄清楚我需要做什么才能访问我的服务以获取令牌(就像我以前那样)。

我的实际配置是(和 git 的例子一样):

@NgModule({
  // ...
  imports: [
    HttpClientModule,
    JwtModule.forRoot({
      config: {
        tokenGetter: () => {
          return <myService>.getToken(); // Here
        }
      }
    })
  ]
})
export class AppModule {}

有可能吗?提前致谢。

【问题讨论】:

    标签: angular typescript angular-di


    【解决方案1】:

    这可以通过覆盖配置服务来完成:

    export const jwtOptionsFactory = (dependency) => ({
        tokenGetter: () => dependency.getToken(),
        whitelistedDomains: []
    });
    
    ...
    imports: [
        JwtModule.forRoot({
            config: { tokenGetter(): string { throw new Error('no tokenGetter') } }
        })
    ],
    providers: [{
        provide: JWT_OPTIONS,
        deps: [Dependency],
        useFactory: jwtOptionsFactory
    }]
    

    从 1.0.0-beta.8 开始,forRoot 接受 options provider

    ...
    imports: [
        JwtModule.forRoot({
            jwtOptionsProvider: {
                provide: JWT_OPTIONS,
                deps: [Dependency],
                useFactory: jwtOptionsFactory
            }
        })
    ]
    

    【讨论】:

    • 感谢您的回答,不幸的是它不起作用(至少对我而言)......它会引发以下错误:Cannot read property 'split' of null。似乎tokenGetter 为空,即使将其设置为useFactory
    • 同样的解决方案按预期对我有用。提供者覆盖在 Angular 中非常简单,如果您在不同的模块中提供 JWT_OPTIONS 并导入 JwtModule(竞争条件),它可能无法正常工作。确保您没有编译错误并使用最新的软件包版本(1.0.0-beta.6)。可以尝试在providerslike that重新组装模块,而不是导入JwtModule,但结果应该和上面一样。
    • 我在 app.module 中做所有事情,不,我没有任何编译错误,并且版本是最新的 (1.0.0-beta.6)。
    • 从我看到的here 看来,null 似乎是从您的函数返回的,而不是由伪造的 tokenGetter 产生的。我更新了帖子以解决这种歧义。
    • 从 1.0.0-beta.8 开始,forRoot 接受选项提供者。
    猜你喜欢
    • 1970-01-01
    • 2016-03-27
    • 2019-07-26
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 2013-11-29
    • 2016-05-30
    相关资源
    最近更新 更多