【问题标题】:JHipster: Receive 401 Unauthorized when making API call to microserviceJHipster:对微服务进行 API 调用时收到 401 Unauthorized
【发布时间】:2017-08-24 13:18:30
【问题描述】:

我目前正在使用 Jhipster 生成以下组件:

  • UAA - 身份验证服务器
  • API 网关
  • 微服务 - 产品1
  • 服务发现 - Consul

其他组件:

  • 自定义前端 (Angular 4) - 在单独的项目中

另外需要注意的是,自定义前端使用 Jhipster angular 4 代码,该代码可以在 vanilla Jhipster Api Gateway 中找到。 这包括 customHttpProvider。

包含的类如下图所示:

目前,我可以使用此设置成功登录并调用 UAA 上的 API,但是,当我尝试调用产品上的任何 API 时,我得到 401 Unauthorized,因为例如发布到 Product1/api/zcd

服务在 Consul 中都是可见的和绿色的,网关也有 UAA 和 Product1 作为注册和可用的路由。

到目前为止,我发现当我对 Product 进行 api 调用时,似乎没有调用 AuthInterceptor。 我尝试手动将 jwt 令牌附加到方法中,这解决了问题,但我不明白为什么不使用 customHttpProvider 来拦截请求并附加令牌。

当我如图所示手动插入令牌时,下面的我的 ProductService 工作,但这显然不是正确的方法。

@Injectable()
export class ProductService {

    private options = new Headers();

    constructor(private http: Http) {
        this.options.append('Authorization', 'Bearer ' + 'token is inserted here');
    }

    priceProduct(productPriceRequest: productPriceRequest): Observable<IdResponse> {
        return this.http.post('Product1/api/zcd', productPriceRequest, { headers: this.options })
            .map(response => response.json());
    }
}

【问题讨论】:

  • Product1 日志中没有与 api 调用相关的内容。它确实命中网关并报告以下行:r.f.g.accesscontrol.AccessControlFilter:访问控制:允许访问 /Product1/api/zcd,因为它与以下授权的微服务端点匹配:/Product1/api 但是它没有超过这一点并且在 UAA(身份)和(微服务)产品 1 中都没有明显的日志
  • 我在 OAuth2AuthenticationProcessingFilter 中注意到,isAuthenticated 方法每隔几秒轮询一次(我猜测是通过调用 UAA),但身份验证字段永远为空。
  • 尝试在 Spring Security 的 Product1 上启用调试日志记录级别。您还可以在 SendForwardFilter run() 方法中设置断点:查看它是否确实向 Product1 github.com/spring-cloud/spring-cloud-netflix/blob/master/… 发送请求
  • 所以我找到了解决与重命名 jwt 令牌存储 bean 有关的问题之一(我将在稍后发布此内容以供参考),但是我现在已经确认令牌没有得到在请求期间附加。作为前端代码的一部分,我采用了一些 Jhipster 类,例如 customHttpProvider。我还验证了当我向 Product 发出请求时没有命中 AuthInterceptor(也是 Jhipster 代码)。你有什么想法为什么会这样。我还调试了 SendForwarfdFilter 并确认上下文中不存在令牌。
  • 另外补充一点,我将 Product 连接到一个普通的 Jhipster 网关前端,并制作了一个简单的按钮来点击 api,它就可以工作了。因此,我有信心在前端缺少一些重要的东西。

标签: angular lazy-loading axon


【解决方案1】:

已解决:

有两件事对我造成了问题。 需要注意的重要一点是,它们与 JHipster 没有直接关联,而是与 Jhipster 集成时出现的问题:

问题:

  1. 轴突 3
  2. 具有延迟加载模块的自定义 Angular 4 前端。

解决方案:

    • 我已将轴突 3 包含到产品微服务中,并作为 axons 配置,它初始化一个令牌存储(没有什么 做安全)。
    • MicroserviceSecurityConfiguration 中原本属于 JwtTokenStore 类型的 tokenStore bean 被重写为 InMemoryTokenStore。
    • 解决方案是将 MicroserviceSecurityConfiguration 中的 tokenStore bean 重命名为 jwtTokenStore。
    • 我有许多延迟加载的模块。根据这种情况下的文档,有 SharedServiceModule 使用 forRoot() 并在 AppModule 中导入。
    • 但是,当我在 ProductModule 中导入服务(例如 ProductService)时,它会覆盖在 SharedServiceModule 中导入的 Http Factory(在 AppModule 中导入 Http Factory 时的行为相同)。
    • 解决方案是创建一个与 customHttpProvider 函数(在 SharedServiceModule 中)处于同一级别的 HttpProviderService。然后,它为应用程序中较低级别的所有其他服务管理 Http。

【讨论】:

  • 有趣,谢谢分享。关于RouterModule.forRoot(),有人报告说JHipster 不应该在任何地方使用,而只能在应用程序模块中使用,而在其他地方使用RouterModule.forChild()。也许它对您的应用产生了影响。
  • 您好 Gaël,不确定您在说什么,但如果我理解正确,那就是我在路由方面的设置。在我的 AppModule 中,我导入了一个 MainRoutingModule 和 AppLazyRoutingModule,它们都使用 forRoot(),然后在所有其他模块中,例如产品 1、产品 2 等,它们都有自己的路由模块,它们实现了 RouterModule.forChild()。我上面在解决方案中提到的 forRoot 与使用静态 forRoot(): ModuleWithProviders 接口的 SharedServiceModule 有关。
  • 好吧,我误会了。
猜你喜欢
  • 2020-03-23
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
相关资源
最近更新 更多