3

我有一个 Java Spring 后端,我已经使用 Kubernetes 清单部署到 ArgoCD 上。通过让用户登录 Keycloak 来保护后端。部署后,我转到 /api/application-info,然后它让我登录到 Keycloak。但是在我登录后,它会将我重定向回来,我只看到This page isn’t working. If the problem continues, contact the site owner. HTTP ERROR 401.

查看后端日志,我看到了Bearer error="invalid_token", error_description="An error occurred while attempting to decode the Jwt: The required audience is missing", error_uri="https://tools.ietf.org/html/rfc6750#section-3.1". 谷歌搜索后,一页说可能是客户 ID 错误,但我仔细检查了它并没有问题。我在“application.yml”文件中设置 Keycloak 客户端 ID,例如:

spring:
  security:
    oauth2:
      client:
        provider:
          oidc:
            issuer-uri: https://mykeycloak.com/auth/realms/myrealm
        registration:
          oidc:
            client-id: myclientid
            client-secret: myclientpw

任何人都知道我还能如何调试这个?

这是虚拟服务。我知道它正在工作,因为 (1) 我可以转到 /api,它会将我带到 /api/,并且 (2) 我转到 /api/application-info,然后它让我登录到 Keycloak。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ingress
spec:
  hosts:
    - myhost.io
  gateways:
    - public-gateway.istio-system.svc.cluster.local
  http:
    - match:
        - uri:
            exact: /api
      redirect:
        uri: /api/
    - match:
        - uri:
            prefix: /api/
      rewrite:
        uri: /api/
      route:
        - destination:
            host: mysite-be
            port:
              number: 80
      websocketUpgrade: true
    - match:
        - uri:
            prefix: /
      route:
        - destination:
            host: mysite-fe
            port:
              number: 80
4

2 回答 2

4

JWT 令牌可以有一个可选的“aud”属性,它指示令牌的目标受众。您的场景中的受众是您的 Spring Boot 应用程序,这意味着应该颁发令牌以访问您的 Spring Boot 应用程序。

作为 Spring 启动应用程序上 JWT 令牌验证的一部分,如果“aud”属性存在,它的值也将被检查以确保令牌被发布以供应用程序使用。

我猜为您的登录生成的令牌不包含“aud”属性的正确/预期值。在这种情况下,您可能需要在 Keycloak 上配置您的客户端。

您可以通过将其粘贴到https://jwt.io/并检查“ aud ”属性来查看令牌中的属性。

解决此问题的解决方法也可能是在您的应用程序中完全禁用受众验证。您可以通过将以下属性添加到keycloak.json文件中来执行此操作:

{
    ...
    verify-token-audience: false
}

实际的解决方案应该是调查它的生成方式并使其产生适当的价值。我建议查看Keycloak 文档中的Audience Support,解释它们是如何生成的以及如何在 Keycloak 中进行配置。

基于RFC-7519 JSON Web Token规范:

“aud”(受众)声明标识了 JWT 的目标接收者。打算处理 JWT 的每个主体都必须使用受众声明中的值来标识自己。如果当该声明存在时,处理该声明的主体未使用“aud”声明中的值来标识自己,则必须拒绝 JWT。在一般情况下,“aud”值是区分大小写的字符串数组,每个字符串都包含一个 StringOrURI 值。在 JWT 有一个受众的特殊情况下,“aud”值可能是包含 StringOrURI 值的单个区分大小写的字符串。受众价值的解释通常是特定于应用程序的。使用此声明是可选的。

于 2020-11-08T10:56:02.373 回答
1

根据您描述的错误,可能是您的集群注入了额外的授权配置。您可能想要检查这些并确保您没有得到未处理的额外/意外配置。

于 2020-11-10T23:43:03.337 回答