能否将Azure AD、Keycloak与Kong集成?实现React前端及Java后端认证
方案可行性确认
这种架构完全可行,核心逻辑是Keycloak作为统一认证层集成Azure AD作为身份提供商(IdP),Kong作为API网关负责拦截请求并验证来自Keycloak的令牌,同时为React前端和Java后端提供一致的认证入口。
具体实现步骤
1. 完成Keycloak与Azure AD的集成
先确保Keycloak成功对接Azure AD,这是整个方案的基础:
- 在Keycloak控制台创建新的Identity Provider,选择
OpenID Connect v1.0类型 - 配置Azure AD的OIDC参数:
- 客户端ID:Azure AD应用注册生成的客户端ID
- 客户端密钥:Azure AD应用注册生成的客户端密码
- 授权端点:
https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/authorize - 令牌端点:
https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token - 用户信息端点:
https://graph.microsoft.com/oidc/userinfo
- 同步Keycloak与Azure AD的重定向URI,确保两者配置一致
- 测试登录流程:通过Keycloak登录页选择Azure AD登录,确认可正常获取用户信息
2. 配置Kong网关的认证插件
Kong使用OpenID Connect插件对接Keycloak,验证请求中的JWT令牌:
- 安装并启用Kong的
openid-connect插件(社区版用此插件,企业版可直接用keycloak插件) - 配置核心参数:
issuer:Keycloak的OIDC issuer地址,格式为http://{keycloak-host}/auth/realms/{realm-name}client_id:Keycloak中为Kong创建的专用客户端ID(需开启Service Accounts Enabled)client_secret:对应客户端的密钥redirect_uri:Kong的回调地址,例如http://{kong-host}/callbackintrospection_endpoint:Keycloak的令牌校验地址,格式为http://{keycloak-host}/auth/realms/{realm-name}/protocol/openid-connect/token/introspect
- 将插件绑定到需要保护的API或路由上
3. React前端的认证集成
前端通过Keycloak JS适配器实现登录,获取令牌后携带到请求中:
- 安装
keycloak-js依赖 - 初始化Keycloak实例并处理登录:
import Keycloak from 'keycloak-js'; const keycloak = new Keycloak({ url: 'http://{keycloak-host}/auth', realm: '{realm-name}', clientId: '{frontend-client-id}' // Keycloak中为React创建的客户端,启用Authorization Code Flow + PKCE }); keycloak.init({ onLoad: 'login-required' }).then(authenticated => { if (authenticated) { localStorage.setItem('access_token', keycloak.token); } }); // 请求Kong时携带令牌 const fetchData = async () => { const token = localStorage.getItem('access_token'); const response = await fetch('http://{kong-host}/api/xxx', { headers: { Authorization: `Bearer ${token}` } }); }; - 处理令牌过期:通过
keycloak.updateToken()方法自动刷新令牌
4. Java后端的认证校验
后端有两种认证方式可选:
- 方式一:依赖Kong前置校验:后端无需额外处理认证,仅通过Kong注入的
X-Userinfo头获取用户信息,同时通过IP白名单或X-Forwarded-For头限制请求来源为Kong - 方式二:后端自行校验:使用Keycloak Java适配器验证令牌:
- 引入
keycloak-spring-boot-starter依赖 - 配置
application.yml:keycloak: auth-server-url: http://{keycloak-host}/auth realm: {realm-name} resource: {backend-client-id} bearer-only: true - 在接口上添加
@RolesAllowed或@PreAuthorize注解实现权限控制
- 引入
关键注意事项
- 确保Keycloak、Kong、前端、后端的时钟同步,避免令牌过期校验出错
- 为不同客户端配置合适的认证流程:前端用Authorization Code Flow + PKCE,Kong用Client Credentials Flow,后端用Bearer-only模式
- 开启Kong插件的令牌 introspection 功能,拦截无效/过期令牌
- 测试端到端流程:前端登录→获取令牌→请求Kong→Kong验证令牌→转发到后端→后端处理请求
内容的提问来源于stack exchange,提问作者wick0025
相关产品推荐
相关产品推荐

