Section 14: Keycloak 集成 (06:24:30 - 06:30:20)

将 Keycloak 添加到 Docker Compose (06:24:30 - 06:24:30)

首先,我们需要将 Keycloak 添加到我们的 Docker Compose 文件中。

打开 docker-compose.yml 文件,并添加以下服务定义:

  keycloak:
    image: quay.io/keycloak/keycloak:24.0.2
    container_name: keycloak_ms
    environment:
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: admin
    ports:
      - "9098:8080"
    networks:
      - microservices-net
    command: start-dev
确保你的 docker-compose.yml 文件中已经定义了 microservices-net 网络。如果没有,请在 docker-compose.yml 文件中添加以下内容:

networks:
  microservices-net:
    driver: bridge
完成以上配置后,运行 docker-compose up -d 命令来启动 Keycloak 容器。

设置 Keycloak (06:24:30 - 06:24:30)

打开浏览器,访问 http://localhost:9098,使用 admin 作为用户名和密码登录 Keycloak 管理控制台。

  1. 创建 Realm (Create Realm):
    • 点击左侧菜单栏的 "Realms",然后点击 "Create realm"。
    • 输入 Realm 名称,例如 "microservices",然后点击 "Create"。
  2. 创建客户端 (Create Client):
    • 在左侧菜单栏中选择你刚刚创建的 Realm("microservices")。
    • 点击 "Clients",然后点击 "Create client"。
    • 选择 "OpenID Connect",输入客户端 ID,例如 "microservice-api",然后点击 "Next"。
      • 设置 "Client authentication" 为 "On"
      • "Authentication flow" 的 "Standard flow" 和 "Direct access grant" 设置为 "Off"
    • 点击 "Save"。
  3. 获取客户端密钥 (Get Client Secret):
    • 在客户端详情页面中,点击 "Credentials" 选项卡。
    • 复制客户端密钥(Client secret),稍后我们将在 API 网关的配置中使用它。

将 Keycloak 依赖项添加到 API 网关 (06:24:30 - 06:24:30)

现在,我们需要将 Keycloak 依赖项添加到 API 网关的 pom.xml 文件中。

 <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
 </dependency>

API 网关安全配置 (06:24:30 - 06:24:30)

打开 application.yml 文件,并添加以下安全配置:

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: http://localhost:9098/realms/microservices

确保将 http://localhost:9098/realms/microservices 替换为你的 Keycloak 服务器地址和 Realm 名称。

使用 Postman 测试安全性 (06:24:30 - 06:30:20)

现在,我们可以使用 Postman 来测试 API 网关的安全性。

  1. 获取访问令牌 (Get Access Token):
    • 在 Postman 中,创建一个新的请求,类型为 POST,URL 为 http://localhost:9098/realms/microservices/protocol/openid-connect/token (替换为你的 Keycloak token endpoint 地址).
    • 在 "Body" 选项卡中,选择 "x-www-form-urlencoded",并添加以下参数:
      • client_id: 你的客户端 ID(例如,"microservice-api")。
      • client_secret: 你的客户端密钥。
      • grant_type: client_credentials
    • 点击 "Send" 获取访问令牌。
  2. 使用访问令牌访问 API (Access API with Access Token):
    • 在 Postman 中,创建一个新的请求,类型为 GET,URL 为 http://localhost:8222/api/v1/products (或者其他你想要测试的 API 端点)。
    • 在 "Authorization" 选项卡中,选择 "OAuth 2.0",并将步骤 1 中获取的访问令牌粘贴到 "Token" 字段中。
    • 点击 "Send"。

如果配置正确,你应该能够成功访问 API,并获取到预期的数据。如果未配置,则会返回 401 Unauthorized 错误。