type
status
date
slug
summary
category
tags
create_time
Jun 1, 2025 04:04 PM
icon
password
my_create_time
🧭 前言
上一篇《nCalendar 单点登录之 Dex 入门篇》大概介绍了 nCalendar 为什么要使用 Dex 以及 Dex 的一些基础概念,本篇开始实操,介绍实际的对接登录流程。
PS:nCalendar 目前已完成了对接,欢迎大家体验。官网地址:https://ncalendar.lusyoe.com
🖼️ 登录流程图

🛠️ 流程分步详解
下面我们分步骤解析 Dex 实现 SSO 的核心流程。
1️⃣ 客户端构造授权请求 URL
用户点击首页的登录按钮后,由客户端构建一个授权请求的URL,如上流程图所示:
PS:这里 ncalendar 是自己实现了一套 connector,在里面处理登录/注册等逻辑。
2️⃣ Dex 跳转到 Connector 登录页
Dex 会根据
/auth/<connector_id>
中的 connector 设置,调用该 Connector 的 LoginURL()
方法,并生成登录链接。PS:这里最好是自定义一个登录页面,原生自带的实在是太丑了。
3️⃣ 用户登录后回调 Dex 的 /callback
成功登录后,用户会被重定向回 Dex 的
/callback
注意:第一次回调的是自身的/callback,而不是第三方服务的。
在该 /callback 中又会回调自定义 connector 的 callback,用于确认是否真的登录登录成功,并获取用户个人信息如:用户名、邮箱等,根据这些信息再生成 OAuth2 授权码(Authorization Code),这个 code 码非常的关键,下一步需要通过这个码来获取token。
4️⃣ Dex 携带 code 跳转到客户端
Dex 完成认证后,会重定向到
redirect_uri
,并携带授权码:5️⃣ 客户端使用 code
向 Dex 请求 id_token
服务端拿到
code
后,发送请求到 Dex的 /token
:Dex 返回 token:
5️⃣ 客户端使用 /keys 校验 token是否有效
客户端拿到返回的 token 之后,首先需要先解析token,看下有没过期,然后调用Dex /keys 接口获取公钥,再到本地校验 token 是否有效。
如果有效,还会再解析 id_token,获取其中的一些参数如:username、email等,当然这里还可以自定义一些参数进去。
以下是我这边解码的结果:
6️⃣ 客户端验证并存储登录态(创建本地 Session/token)
虽然获取了
id_token
,但多数 Web 应用会在此基础上创建本地 session,以便后续鉴权、刷新、用户信息维护等操作,当然也可以使用这个公共的 id_token,只是可能不太安全。我这里是创建的 jwt token,然后写入到浏览器的 cookie 中,后续使用自己的 token 进行鉴权。
7️⃣ 跳转到用户个人信息页面
最后一步就是重定向前端页面跳转到用户个人信息页面,在这个页面也会自动携带 cookie 里面的token,供我们后端验证。
✅ 总结
Dex 作为开源的 OIDC 提供器,能够以标准化、安全、可扩展的方式,为多系统、多客户端实现单点登录(SSO)。
自己也可以很方便的实现 connector,跟自建的系统进行对接,同时也很容易跟第三方系统对接,如:github、google等。
🔚 总之无论你是要将 Dex 集成到自建服务,还是希望接入外部认证平台(如企业微信、钉钉、短信验证码系统),理解以上流程都是实现稳定、安全 SSO 的关键第一步。
有关文章的任何疑问,欢迎您在底部评论区留言,一起交流~
若文章对您有帮助,欢迎 请我喝杯咖啡~
- 作者:lusyoe
- 链接:https://blog.lusyoe.com/article/ncalendar-dex-sso-login-flow
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。