深信服零信任 aTrust 对接 Keycloak(OIDC)实战指南

企业级 SSO 接入实战,重点避坑:redirect_uri、Token脚本、用户映射

目录

一、场景说明

[1.1 对接本质](#1.1 对接本质)

[1.2 对接目标](#1.2 对接目标)

[1.3 协议说明](#1.3 协议说明)

二、对接前提(必须提前获取)

[2.1 元数据接口(推荐优先使用)](#2.1 元数据接口(推荐优先使用))

[2.2 核心接口(Keycloak 示例)](#2.2 核心接口(Keycloak 示例))

[2.3 必备参数](#2.3 必备参数)

[三、Keycloak 侧配置(客户侧)](#三、Keycloak 侧配置(客户侧))

[3.1 创建 Client](#3.1 创建 Client)

​编辑

[3.2 获取 Client Secret](#3.2 获取 Client Secret)

[3.3 配置 Redirect URI(最大坑点)](#3.3 配置 Redirect URI(最大坑点))

[四、零信任 aTrust 配置(核心)](#四、零信任 aTrust 配置(核心))

[4.1 阶段一:获取授权码(code)](#4.1 阶段一:获取授权码(code))

[4.2 阶段二:获取 Token(关键步骤)](#4.2 阶段二:获取 Token(关键步骤))

[🔧 Token 处理脚本(必须配置)](#🔧 Token 处理脚本(必须配置))

[⚠️ 关键说明](#⚠️ 关键说明)

[4.3 阶段三:获取用户信息](#4.3 阶段三:获取用户信息)

提取字段

[4.4 阶段四:注销配置(推荐)](#4.4 阶段四:注销配置(推荐))

五、高频问题排查(实战)

[5.1 redirect_uri 报错](#5.1 redirect_uri 报错)

[5.2 invalid_grant](#5.2 invalid_grant)

[5.3 UserInfo 获取失败](#5.3 UserInfo 获取失败)

[5.4 登录循环](#5.4 登录循环)

[5.5 变量引用错误](#5.5 变量引用错误)

六、实施经验总结

[核心 4 条](#核心 4 条)

总结


一、场景说明

1.1 对接本质

在企业实际项目中,零信任对接 OAuth2 的本质并不是"实现认证",而是:

接入已有身份系统(如 Keycloak),复用认证能力

典型特点:

  • 企业已部署统一身份平台(Keycloak / Azure AD 等)

  • 零信任不维护本地账号

  • 所有认证由身份中心完成


1.2 对接目标

本次对接的核心目标:

  • 实现统一 SSO(单点登录)

  • 用户使用企业账号登录零信任

  • 零信任专注访问控制(认证交由OIDC服务)


1.3 协议说明

本方案使用:

OAuth2 + OIDC(OpenID Connect)

区别说明:

  • OAuth2:授权框架(获取 access_token)

  • OIDC:身份层(获取用户信息 userinfo / id_token)

👉 本文涉及 userinfo、openid scope,属于 OIDC 标准流程


二、对接前提(必须提前获取)

⚠️ 实施第一步:先拿参数,再配置


2.1 元数据接口(推荐优先使用)

Keycloak 提供标准 OIDC 发现接口:

http://{host}:{port}/realms/{realm}/.well-known/openid-configuration

示例:

http://10.253.253.66:8080/realms/demo/.well-known/openid-configuration

作用:

  • 自动获取所有端点地址

  • 避免手动填写错误


2.2 核心接口(Keycloak 示例)

接口用途 地址 说明
认证地址 /protocol/openid-connect/auth 获取 code
Token 地址 /protocol/openid-connect/token 获取 access_token
用户信息 /protocol/openid-connect/userinfo 获取用户信息
注销接口 /protocol/openid-connect/logout 单点登出

2.3 必备参数

参数 说明 示例
client_id 客户端 ID atrust
client_secret 客户端密钥 ******
redirect_uri 回调地址(必须完全一致) https://xxx/passport/...
scope 权限范围 openid profile email

三、Keycloak 侧配置(客户侧)


3.1 创建 Client

路径:

Realm → Clients → Create

配置:

配置项
Client ID atrust
Client Protocol openid-connect
Client authentication ON
Standard Flow ON(授权码模式)

3.2 获取 Client Secret

路径:

Clients → atrust → Credentials


3.3 配置 Redirect URI(最大坑点)

路径:

Clients → atrust → Settings → Valid Redirect URIs

示例:

https://xxxxxx.top:4430/passport/v1/auth/httpsOauth2

强制要求:

  • 协议一致(http/https)

  • 域名一致

  • 端口一致

  • 路径完全一致

👉 任何一个字符不一致都会报错


四、零信任 aTrust 配置(核心)


4.1 阶段一:获取授权码(code)

  • 请求方式:GET

  • 核心参数:

response_type=code

client_id=xxx

redirect_uri=xxx

scope=openid profile email

  • 返回:

👉 提取 code → 存入 env.code


4.2 阶段二:获取 Token(关键步骤)

  • 请求方式:POST

  • 请求头:

Content-Type: application/x-www-form-urlencoded

请求体参数:

参数 配置值 说明
grant_type authorization_code 固定值
code {{env.code}} 引用上一阶段获取的授权码(关键语法:双大括号)
client_id atrust 客户端ID
client_secret FSIF6POw2R7p3I0Rjsc9kH1MRnxvVFRp 客户端密钥
redirect_uri https://xxxxxx.top:4430/passport/v1/auth/httpsOauth2 必须与Authorization阶段一致

🔧 Token 处理脚本(必须配置)

function AfterResponse(response, result) {

// TODO: 在此添加nodejs代码

env.access_token =JSON.parse(response.body).access_token;

result.access_token = env.access_token;

}

AfterResponse(response, result);


⚠️ 关键说明

  • env:aTrust 内置环境变量对象

  • 用于跨阶段传递数据(类似 session)

👉 不写脚本 = 后续 UserInfo 必失败


4.3 阶段三:获取用户信息

  • 请求方式:GET

Authorization: Bearer {{env.access_token}}


提取字段

preferred_username

👉 映射为零信任用户名


4.4 阶段四:注销配置(推荐)

配置:

/logout

作用:

  • 清理 Keycloak 会话

  • 避免退出后自动登录


五、高频问题排查(实战)


5.1 redirect_uri 报错

现象

invalid_redirect_uri

原因

  • 回调地址不一致

排查

  • 逐字符核对:

    • 协议

    • 域名

    • 端口

    • 路径


5.2 invalid_grant

现象

  • token 获取失败

原因

  • code 已使用 / 过期

  • redirect_uri 不一致

排查

  • 重新获取 code

  • 检查 redirect_uri


5.3 UserInfo 获取失败

现象

  • 无法获取用户信息

原因

  • scope 未包含 openid

  • access_token 未正确传递

排查

  • scope 必须包含 openid

  • 检查 token 脚本执行


5.4 登录循环

现象

  • 一直跳转登录

原因

  • token 未写入 env

  • 用户字段未正确提取


5.5 变量引用错误

错误写法

env.access_token

正确写法

{{env.access_token}}


六、实施经验总结


核心 4 条

  1. 先拿接口文档,再配置

  2. redirect_uri 是最大坑点

  3. Token 脚本是核心步骤

  4. 建议配置logout,避免会话残留


总结

本质上,这类对接只需抓住两点:

1️⃣ redirect_uri 必须完全一致

2️⃣ access_token 必须正确获取并传递

掌握这两个关键点,

无论是 Keycloak、Azure AD 还是其他 OIDC 服务,都可以快速完成对接。

相关推荐
为何创造硅基生物16 小时前
ESP32S3的RGB屏幕漂移问题
网络
好运的阿财17 小时前
process 工具与子agent管理机制详解
网络·人工智能·python·程序人生·ai编程
周杰伦fans17 小时前
C# required 关键字详解
开发语言·网络·c#
洛水水17 小时前
深入理解网络编程核心:Reactor、IOCP 与异步 IO 模型详解
网络·iocp
千枫s17 小时前
电脑vm虚拟机kali linux安装shannon
学习·网络安全
favour_you___17 小时前
epoll惊群问题与解决
服务器·网络·tcp/ip·epoll
北方的流星17 小时前
华三网络设备的路由重定向配置
运维·网络·华三
.select.18 小时前
TCP 3
服务器·网络·tcp/ip
阿捏利18 小时前
详解网络协议(十六)UDP协议
网络·网络协议·udp
数字供应链安全产品选型18 小时前
AI造“虾”易,治理难?悬镜多模态 SCA 技术破局 AI 数字供应链治理困局!
人工智能·安全·网络安全·ai-native