在Keycloak中生成JWT Token并获取公钥在第三方平台上验证JWT Token

问题描述 投票:0回答:2

后端服务器有一个端点,它在 ping 时提供 JSON 响应,并受 Apigee Edge 代理 保护。目前,此端点没有安全性,我们希望为所有发出请求的客户端实施仅承载令牌身份验证。 所有向 API 发出请求的客户端都将在授权承载中发送 JWT 令牌,Apigee Edge 将用于验证 JWT 令牌。

如何使用 Keycloak 生成此 JWT 令牌?

此外,Apigee 需要JWT 令牌来源公钥(签署 JWT 令牌的服务器,在本例中,我相信是 Keycloak)。 所以我的第二个疑问是,当我使用 Keycloak 生成 JWT 令牌时,如何获取服务器用来验证令牌是否有效的公钥?

jwt keycloak apigee keycloak-services
2个回答
104
投票

这是在这篇中等文章的帮助下弄清楚的。我在下面提到的所有步骤在文章中都有详细的描述(令牌部分请参阅步骤 1 到 9,其他步骤与 Spring Boot 应用程序相关),但我想概述一下我的问题中提到的那些步骤。

使用 KeyCloak 生成 JWT 令牌

  1. 安装并运行 KeyCloak 服务器并转到端点(例如 http://localhost:8080/auth)。使用初始管理员登录名和密码登录(用户名=admin,密码=admin)。
  2. 创建一个领域和一个客户端,其中
    openid-connect
    作为
    Client Protocol
  3. 创建用户、角色并将客户端角色映射到用户。
  4. 假设服务器位于
    localhost
    ,访问 http://localhost:8080/auth/realms/dev/.well-known/openid-configuration 会提供有关所有安全端点的详细信息
  5. http://localhost:8080/auth/realms/dev/protocol/openid-connect/token 向此 URL 发送包含有效详细信息的 POST 请求,即可获得 JWTtoken。

获取KeyCloak服务器的公钥

  • 转到
    Realm Settings
    并单击
    Public key
    会弹出该领域服务器的公钥。请参阅此图片以更好地理解。
  • 添加
    -----BEGIN PUBLIC KEY-----
    并将
    -----END PUBLIC KEY-----
    附加到此复制的公钥中,以便在任何地方使用它来验证 JWTtoken。你的公钥最终应该看起来像这样:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhAj9OCZd0XjzOIad2VbUPSMoVK1X8hdD2Ad+jUXCzhZJf0RaN6B+79AW5jSgceAgyAtLXiBayLlaqSjZM6oyti9gc2M2BXzoDKLye+Tgpftd72Zreb4HpwKGpVrJ3H3Ip5DNLSD4a1ovAJ6Sahjb8z34T8c1OCnf5j70Y7i9t3y/j076XIUU4vWpAhI9LRAOkSLqDUE5L/ZdPmwTgK91Dy1fxUQ4d02Ly4MTwV2+4OaEHhIfDSvakLBeg4jLGOSxLY0y38DocYzMXe0exJXkLxqHKMznpgGrbps0TPfSK0c3q2PxQLczCD3n63HxbN8U9FPyGeMrz59PPpkwIDAQAB
-----END PUBLIC KEY-----

在第三方平台验证令牌

  • jwt.io 是一个很棒的验证 JWT 令牌的网站。全部 我们要做的就是粘贴令牌和公钥。请阅读此处网站的介绍,了解有关验证代币的更多信息。

0
投票

keycloak 23 更新

您可以使用

docker-compose.yml
使用
docker compose up
安装它:

networks:
  keycloak-network:
    external: true

services:
  postgres:
    container_name: backend-postgres
    image: postgres:15.6-alpine
    volumes:
      - ./postgres:/var/lib/postgresql/data
      - ./00_create_db.sql:/docker-entrypoint-initdb.d/create-db.sql
    environment:
      POSTGRES_DB: postgres
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    ports:
      - 5432:5432
    networks:
      - default
    healthcheck:
      test: [ "CMD", "pg_isready", "-q", "-d", "postgres", "-U", "postgres" ]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 60s
    restart: unless-stopped

  keycloak:
    container_name: backend-keycloak
    image: bitnami/keycloak:23.0.6
    environment:
      KEYCLOAK_DATABASE_VENDOR: postgresql
      KEYCLOAK_DATABASE_HOST: postgres
      KEYCLOAK_DATABASE_PORT: 5432
      KEYCLOAK_DATABASE_NAME: keycloak
      KEYCLOAK_DATABASE_USER: postgres
      KEYCLOAK_DATABASE_PASSWORD: postgres
      KEYCLOAK_DATABASE_SCHEMA: public
      KEYCLOAK_ADMIN_USER: keycloak
      KEYCLOAK_ADMIN_PASSWORD: keycloak
      KC_HTTP_ENABLED: 'true'
    links:
      - postgres
    ports:
      - 8080:8080
    networks:
      - default
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy

00_create_db.sql

CREATE DATABASE keycloak;

然后打开 http://localhost:8080/admin 并使用

keycloak:keycloak
登录。

创建一个领域 realm create button

在realm下创建客户端 client create button

选择 OpenID Connect 作为

Client type
client setup

现在您可以获得:

  • 所有安全端点:GET http://localhost:8080/realms//.well-known/openid-configuration
  • 证书:获取http://localhost:8080/realms//protocol/openid-connect/certs
  • 令牌(在客户端设置中关闭
    Client authentication
    ):
    curl -X POST 'http://localhost:8080/realms/<REALM>/protocol/openid-connect/token' -H 'Content-Type: application/x-www-form-urlencoded' -d 'client_id=<CLIENT_ID>' -d 'username=<USER>' -d 'password=<PASS>' -d 'grant_type=password' -d 'scope=email profile
  • 令牌(在客户端设置中启用
    Client authentication
    ):
    curl -X POST 'http://localhost:8080/realms/<REALM>/protocol/openid-connect/token' -H 'Content-Type: application/x-www-form-urlencoded' -d 'client_id=<CLIENT_ID>' -d 'username=<USER>' -d 'password=<PASS>' -d 'grant_type=password' -d 'scope=email profile -d 'client_secret=<CLIENT_SECRET>'
© www.soinside.com 2019 - 2024. All rights reserved.