如何在 Micronaut GraphQL 中使用 Keycloak JWT 进行身份验证

Posted

技术标签:

【中文标题】如何在 Micronaut GraphQL 中使用 Keycloak JWT 进行身份验证【英文标题】:How to use Keycloak JWT for authentication in Micronaut GraphQL 【发布时间】:2021-12-09 03:53:24 【问题描述】:

我正在尝试通过 keycloak JWT 使用 Micronaut GraphQL。我能够使用基本身份验证,尝试转移到不记名令牌,但我错过了一些东西,因为我总是得到 401 Unauthorized,但我在日志中没有看到任何有用的错误消息,甚至将日志记录设置为 TRACE

使用 Micronaut 3.0.0。

我的 application.yml 看起来像这样:

micronaut:
  application:
    name: myapp
  server:
    cors:
      enabled: true
    port: 8080
  security:
    authentication: bearer
    intercept-url-map:
      - pattern: /graphiql
        access:
          - isAnonymous()
      - pattern: /graphql
        access:
          - isAuthenticated()
    endpoints:
      login:
        enabled: false
    token:
      jwt:
        enabled: true
        signatures:
          jwks:
            keycloak:
              url: http://xx.xx.xx.xx:8090/auth/realms/myrealm/protocol/openid-connect/certs
    oauth2.clients.keycloak:
      grant-type: password
      client-id: myapp-backend
      client-secret: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
      authorization:
        url:  http://xx.xx.xx.xx:8090/auth/realms/myrealm/protocol/openid-connect/auth
custom:
  keycloak:
    url: http://xx.xx.xx.xx:8090

graphql:
  enabled: true
  path: /graphql
  graphiql:
    enabled: true
    path: /graphiql

这是我要测试的内容:

curl --location --request POST 'localhost:8080/graphql' \
--header 'Authorization: Bearer exceptionally long jwt token' \
--header 'Content-Type: application/json' \
--data-raw '"query":"query test  scenarios  id  ","operationName":"test"'

我不确定还有什么有用的。有什么想法吗?

【问题讨论】:

您的要求是什么样的? 添加了我的测试 curl 语句(删除了 jwt 令牌) 我对micronaut了解不多,但不应该有openid的配置吗? 【参考方案1】:

我对 Micronaut 了解不多,但这不是缺少这样的 openid 配置吗:

micronaut:
  security:
    oauth2.clients.keycloak.openid:
      issuer: http://xx.xx.xx.xx:8090/auth/realms/myrealm

【讨论】:

不,这并没有纠正我的错误,但是,我的问题是我搞砸了我的域名。我将发布一个为后代提供最低必要配置的答案。 要清楚,这很有帮助,因为我没有在 custom.keycloak.url 部分中完全指定我的网址。【参考方案2】:

在调试器中进行更多搜索和单步调试后,我终于确定我输入了错误的域名。

但是,为了后代,这是我需要运行的最小配置:

micronaut:
  application:
    name: myapplication
  server:
    cors:
      enabled: true
    port: 8080
  security:
    enabled: true
    authentication: bearer
    intercept-url-map:
      - pattern: /graphiql
        access:
          - isAnonymous()
      - pattern: /graphql
        access:
          - isAuthenticated()
    endpoints:
      login:
        enabled: false
    token:
      jwt:
        enabled: true
        signatures:
          jwks:
            keycloak:
              url: http://xx.xx.xx.xx:8090/auth/realms/MyRealm/protocol/openid-connect/certs
    oauth2.clients.keycloak:
      grant-type: password
      client-id: myapp-backend
      client-secret: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
      authorization:
        url: http://xx.xx.xx.xx:8090/auth/realms/MyRealm/protocol/openid-connect/auth

custom:
  keycloak:
    url: http://xx.xx.xx.xx:8090/auth/realms/MyRealm

graphql:
  enabled: true
  graphiql.enabled: true
  graphql-ws.enabled: true

【讨论】:

以上是关于如何在 Micronaut GraphQL 中使用 Keycloak JWT 进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何为 graphql-java-servlet 和 Micronaut 控制器配置 GraphQL servlet 端点?

这里有人成功将 Micronaut GraphQL API 部署到 AWS Lambda 吗?

如何配置 Jackson 在 Micronaut 中使用 SNAKE_CASE?

Micronaut 3:如何使用 PubSubEmulatorContainer

您如何使用本地属性从 gradle 运行 micronaut

如何像在 grails 中一样使我的 h2 数据库在 micronaut 中持久化?