什么是Keycloak中的令牌交换功能,重点是如何集成自定义身份提供程序以实现无缝的外部到内部认证。它将指导你如何在Keycloak中设置,开启令牌交换功能,以及在自定义身份提供程序与Keycloak之间交换令牌。
简介在今天日益互联的数字景观中,有效的身份验证和授权机制对于保护应用程序和服务的安全至关重要。Keycloak 是一个开源的身份和访问管理解决方案,提供了强大的令牌交换功能,使应用程序能够无缝地在多个身份提供者之间委托用户的认证和访问。本指南旨在向您介绍 Keycloak 中的令牌交换概念及其具体应用,重点介绍如何与自定义身份提供者集成以促进外部到内部的令牌互换。
什么是代币交换?令牌交换指的是应用可以将其获得的访问令牌换成另一种令牌,通常是为了在不同的安全环境中访问资源或服务。这在处理多个认证源或微服务时特别有用,因为在这种情况下,不同的服务可能需要不同类型的令牌。
令牌互换
有关代币交换的更多详细信息可以在那里找到,在RFC 8693中。
OAuth 2.0,令牌交换功能
为什么用Keycloak(一个身份验证和授权平台)交换令牌?
Keycloak 通过其灵活的令牌交换能力,简化了集成各种身份提供者的过程。你可以通过使用 Keycloak:
- 集中管理不同服务的认证。
- 简化操作流程,实现资源的安全访问。
- 支持多种认证方式及用户会话。
- 让不同身份提供商的系统可以互相操作。
请参见下面的链接以获取更多详细信息和有关Keycloak令牌交换的指南,它支持多种用例场景。
使用令牌交换功能Keycloak 是一个开源的身份和访问管理工具https://www.keycloak.org/securing-apps/token-exchange?source=post_page-----e6538b0754e3--------------------------------
在此keycloak讨论中,您可以找到更多有关令牌交换的详细信息。
先决条件在开始与Keycloak进行令牌互换之前,请确保你已经准备好以下几点:
- 运行中的Keycloak实例。
- 自定义配置的身份提供商。
- 基本了解OAuth2和OpenID Connect协议。
步骤 1:配置 Keycloak
- 安装 Keycloak(按照 Docker 安装指南):按照安装指南在本地或您选择的云环境中设置 Keycloak 实例。
- 创建一个域:在 Keycloak 管理控制台中为您的应用创建一个新的域。
设置 Keycloak
请在下方找到我用于在本地机器上配置Keycloak的配置文件。
version: '3.7'
services:
postgres:
image: postgres:16.2
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
networks:
- keycloak_network
restart: 总是重启
keycloak:
image: quay.io/keycloak/keycloak:25.0.1
command: start
environment:
# Keycloak 服务器配置
KC_HOSTNAME: localhost
KC_HOSTNAME_PORT: 8080
KC_HTTP_ENABLED: true
KC_HOSTNAME_STRICT_BACKCHANNEL: false
KC_HOSTNAME_STRICT_HTTPS: false
# 启用健康检查及其他必要设置
KC_HEALTH_ENABLED: true
# 启用令牌交换
KC_FEATURES: token-exchange,admin-fine-grained-authz
KEYCLOAK_FEATURES: token-exchange,admin-fine-grained-authz
# Keycloak管理员凭据
KEYCLOAK_ADMIN: ${KEYCLOAK_ADMIN}
KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD}
# 数据库设置
KC_DB: postgres
KC_DB_URL: postgresql://postgres/${POSTGRES_DB}
KC_DB_USERNAME: ${POSTGRES_USER}
KC_DB_PASSWORD: ${POSTGRES_PASSWORD}
ports:
- 8080:8080
extra_hosts:
- "host.docker.internal:host-gateway"
restart: 总是重启
depends_on:
- postgres
networks:
- keycloak_network
volumes:
postgres_data:
driver: local
网络:
keycloak_network:
driver: bridge
步骤 2:开启令牌交换
Keycloak 已经支持 OAuth RFC 8693: 令牌交换 许多年了,尽管它自创建以来一直作为技术预览功能存在。
- 设置客户端:创建或选择用于令牌交换的客户端。确保客户端有足够的角色和权限进行令牌交换。
设置客户端
为客户制定策略
- 启用预览功能:我们需要在运行Keycloak期间设置环境变量,以便启用预览功能。
# 开启令牌交换
KC_FEATURES: token-exchange,admin-fine-grained-authz
开启令牌交换
- 配置身份提供器:导航到身份提供器区域,并配置自定义身份提供器(比如,OAuth2、SAML等)。通过测试身份验证流程确保其正常工作。
配置身份提供方
- 启用身份提供商的令牌交换功能:导航到权限设置并启用令牌交换。
开启身份识别提供商的令牌互换:
</TRANSLATION>
为了在自定义的身份提供程序和Keycloak之间交换令牌。
- 获取访问令牌:首先,登录自定义身份提供商以获取访问令牌。
- 交换令牌请求:使用从自定义身份提供商获取的访问令牌向Keycloak请求新的令牌。这可以通过调用以下API来完成:
# 基于`curl`命令的示例用于获取访问令牌的请求
curl --location 'http://localhost:8080/realms/master/protocol/openid-connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Cookie: connect.sid=s%3ALJ6wO4vwIjmQ0g_PzNQUIBAHM4_xVBFb.gyCbx7fm7Z%2BYMR9IXTJe%2Fc%2FAkuPt%2FyA%2B7w3UseHqSjA' \
--data-urlencode 'grant_type=urn:ietf:params:oauth:grant-type:token-exchange' \ # 请求的令牌类型
--data-urlencode 'requested_token_type=urn:ietf:params:oauth:token-type:access_token' \ # 请求的令牌类型
--data-urlencode 'client_id=internal' \ # 客户端ID
--data-urlencode 'client_secret=aqMXRDJNSFIsXbTxlXoIRWZHIa0VXizN' \ # 客户端密钥
--data-urlencode 'subject_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyMSIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUiLCJpYXQiOjE3Mjg4NDQ5MDUsImV4cCI6MTcyODg0ODUwNX0.H8Gozs_6_HwJcoGj95j3m-WpeMD5MXjNZZXH3bA9QWk' \ # 主体令牌
--data-urlencode 'subject_issuer=SANTOSH' \ # 主体发行者
--data-urlencode 'subject_token_type=urn:ietf:params:oauth:token-type:access_token' \ # 主体令牌类型
上面提到的那个请求的结果
![](https://imgapi.imooc.com/67452bb20985796314001077.jpg)
请参见下方的NodeJS OAuth提供器的源码。
## NodeSeQ(NodeSeQ 是原文中的专有名词,保持不变)- Node TypeScript Sequelize PostgreSQL 模板项目 - @santoshshinde2012/node-ts-sequelize-pg-boilerplategithub.com](https://github.com/santoshshinde2012/node-ts-sequelize-pg-boilerplate?source=post_page-----e6538b0754e3--------------------------------)
## 第4步:测试一下你的实现效果
一旦设置了令牌交换设置,测试整个流程以确保一切按预期进行,确保令牌正确交换并且访问控制策略是否按预期生效。查看Keycloak日志,过程中是否有任何错误或问题。
![](https://imgapi.imooc.com/67452bbc0aad691a19201080.jpg)
试试你的实现吧
# 结论如下
Keycloak的令牌交换特性为将自定义身份提供程序集成到身份验证工作流程提供了强大的手段。按照本指南,您应该已经熟悉了如何在Keycloak中设置和实现令牌交换,从而实现在多个平台上的无缝登录。
想要进一步探索,可以深入了解Keycloak的详细文档和社区讨论区,了解高级配置和最佳做法。
# 参考
感谢阅读。请分享您的评论,如果这篇博客对您的学习有帮助,请给我点个赞。请[**关注我**](https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fsubscribe%2Fuser%2Ff5cfa346da5&operation=register&redirect=https%3A%2F%2Fblog.santoshshinde.com%2F&user=Santosh+Shinde&userId=f5cfa346da5)以便获得更多更新,期待您的反馈。