Envoy Gateway:十分钟搞定单点登录(SSO)!
创始人
2025-07-08 15:30:11
0

单点登录(SSO)简化了用户体验,使用户能够在访问多个应用时只需一次登录。这提高了用户满意度,减少了密码遗忘的风险,同时增强了安全性。但是,实现单点登录并不容易,需要应用程序实现和认证服务器的交互逻辑,增加了应用程序的开发工作量。Envoy Gateway 在最新版本中的安全策略中提供了 OpenID Connect (OIDC) 的能力,采用 Envoy Gateway,无需对应用做任何修改,在十分钟内即可立刻实现单点登录。

什么是单点登录(SSO) ?

SSO 是 英文 Single Sign-On 的缩写,翻译为中文即为单点登录。当采用单点登录之后,用户只需要登录一次,就可以访问多个应用系统。SSO 通常由一个独立的身份管理系统来完成,该系统为每个用户分配一个全局唯一的标识,用户在登录时,只需要提供一次身份认证,就可以访问所有的应用系统。我们在使用一些网站时,经常会看到“使用微信登录”、“使用 Google 账户登录”等按钮,这些网站就是通过 SSO 来实现的。

采用单点登录有以下几个好处:

  • • 用户只需要登录一次,就可以访问多个应用系统,不需要为每个应用系统都单独登录。
  • • 应用系统不需要自己实现用户认证,只需将认证工作交给单点登录系统,可以大大减少应用系统的开发工作量。

图片图片

什么是 OpenID Connect (OIDC) ?

SSO 通常是通过 OpenID Connect (OIDC) ¹ 来实现的。OIDC 是一个基于 OAuth 2.0 ² 协议之上的身份认证协议。

OAuth 2.0 协议本身是一个授权协议,OAuth 2.0 协议中的授权服务器(Authorization Server)负责对用户进行身份认证,认证成功后,授权服务器会向客户端颁发一个访问令牌(Access Token),客户端可以使用该令牌来访问该用户的受保护的资源。例如用户可以通过 OAuth 2.0 授权一个第三方应用访问其 Github 账号下的代码库。Access Token 是一个透明的字符串,只有授权服务器才知道如何解读。客户端会在访问受保护资源时带上 Acces Token,授权服务器根据 Access Token 来判断该请求是否有访问指定资源的权限。Access Token 只用于对资源访问进行授权,其中并没有用户身份信息。

OIDC 通过在 OAuth 2.0 协议之上增加了一个 ID Token 来实现身份认证。OIDC 的认证过程和 OAuth 2.0 的认证过程是一样的,只是认证服务器在对用户认证后向客户端颁发的是一个 ID Token 而不是 Access Token。ID Token 是一个 JSON Web Token (JWT) ³,JWT Token 是一个标准的格式,其中包含了用户的身份信息,例如用户的唯一标识,用户名,邮箱等,并且可以通过认证服务器的公钥进行验证,因此可以代表登录的用户身份。OIDC 通过 ID Token 来实现身份认证,从而实现了单点登录。

备注:由于篇幅有限,本文对 OAuth 2.0 只做简单介绍,如果感兴趣的话,可以移步阮一峰老师的 OAuth 2.0 介绍 ⁴ 系列文章进一步了解协议的原理。

Envoy Gateway OIDC 认证过程

Envoy Gateway 在最新版本中的安全策略中提供了 OIDC 的能力,可以通过 OIDC 来实现单点登录。OIDC 标准支持通过 OAuth 2.0 中的 Authorization Code Flow,Implicit Flow,Hybrid Flow 三种方式来进行身份认证。Envoy Gateway 采用了其中最安全,也是最常用的 Authorization Code Flow ⁵。下图展示了 Envoy Gateway OIDC 的认证过程。

图片图片

  • • 当用户访问一个需要进行 OIDC 认证的 HTTPRoute 时,Envoy Gateway 会检查请求中是否有代表用户身份的 ID Token,如果没有,或者 Token 已经过期,则会将请求重定向到 OIDC Provider 的认证页面。
  • • 用户在 OIDC Provider 的认证页面输入用户名和密码等身份信息进行认证。认证成功后,OIDC Provider 会将用户重定向到 Envoy Gateway 的回调地址,并且带上一个 Authorization Code。
  • • Envoy Gateway 收到 OIDC Provider 的回调请求后,会将 Authorization Code 发送给 OIDC Provider,OIDC Provider 根据 Authorization Code 生成一个 ID Token,并将 ID Token 返回给 Envoy Gateway。
  • • Envoy Gateway 收到 ID Token 后,会将 ID Token 保存在一个 Cookie 中,并将请求重定向到原来的 HTTPRoute。
  • • 当用户再次访问该 HTTPRoute 时,Envoy Gateway 会从 Cookie 中获取 ID Token,验证该 ID Token 合法,并且未过期后,Envoy Gateway 会将请求转发给后端服务。

从图中可以看到,虽然 OIDC 单点登录的过程比较复杂,但都是由 Envoy Gateway 来完成的。对于应用程序来说,这个过程其实是无感知的,应用程序无需修改任何代码,就可以实现单点登录。

采用 Envoy Gateway 为应用实现单点登录

采用 Envoy Gateway 可以简化应用关于用户登录的实现,应用程序无需在代码中实现和 OIDC Provicer 交互的相关逻辑,只需要在 Envoy Gateway 的安全策略中配置 OIDC 的相关参数,在十分钟内可实现应用的 OIDC SSO。下面我们通过一个例子来演示如何在 Envoy Gateway 中配置 OIDC。

配置 OIDC Provider

Envoy Gateway 支持所有实现了 OIDC 标准的 Identify Provider,包括 Google、微软、Auth0、Okta、微信、微博等等。下面我们以 Google 账户登录为例介绍如何为 Envoy Gateway 配置 OIDC SSO。

首先需要参照 Google 的 OpenID Connect 文档 ⁶ Google Cloud Platform 中创建一个 OAuth Client ID。

打开 Google Cloud Console 的 Credentials 界面,点击 Create Credentials -> OAuth client ID,然后选择 Web application,输入应用的名称,设置 Authorized redirect URLs 为 https://www.example.com/oauth2/callback,然后点击 Create 按钮创建 OAuth Client ID。

图片图片

备注:Envoy Gateway 采用 %REQ(x-forwarded-proto)%://%REQ(:authority)%/oauth2/callback 作为默认的 OIDC 回调地址,因此需要将 Authorized redirect URLs 设置为 https://www.example.com/oauth2/callback。

创建成功后,会弹出一个页面显示创建的 OAuth client 的信息,记录下其中的 Client ID 和 Client Secret,这两个值将会用于后面的 Envoy Gateway 安全策略配置中。

图片图片

配置 Envoy Gateway 安全策略

首先参照 Envoy Gateway Quickstart ⁷ 安装 Envoy Gateway 和例子程序。根据 OIDC 规范的建议,Envoy Gateway 要求配置 OIDC 的 Listener 采用 HTTPS 协议,因此前参照 Secure Gateway ⁸为 Envoy Gateway 配置 HTTPS。

创建一个 Kubernetes Secret,用于存储 OAuth Client 的 Client Secret。

注意将 ${CLIENT_SECRET} 替换为上面创建的 OAuth Client 的 Client Secret。

$ kubectl create secret generic my-app-client-secret --from-literal=client-secret=${CLIENT_SECRET}
secret "my-app-client-secret" created

然后在 Envoy Gateway 中配置 OIDC SSO,首先需要在 Envoy Gateway 中配置一个安全策略,该安全策略用于配置 OIDC SSO 的相关参数。

注意将 ${CLIENT_ID} 替换为上面创建的 OAuth Client 的 Client ID。

cat <

上面短短十来行配置就会将 OIDC SSO 应用到名为 backend 的 HTTPRoute 上。这样,当客户端请求访问该 HTTPRoute 时,就会被重定向到 Google 页面进行用户验证 。除了 HTTPRoute,Envoy Gateway 还支持将 SecurityPolicy 应用到 Gateway 上,只要将 targetRef 指向 Gateway 即可。

验证单点登录

如果集群有对外暴露的 LoadBalancer,可以直接通过 LoadBalancer 的地址访问 Envoy Gateway。如果集群没有对外暴露的 LoadBalancer,可以通过 Port-Forward 的方式将 Gateway 的端口映射到本地,例如:

export ENVOY_SERVICE=$(kubectl get svc -n envoy-gateway-system --selector=gateway.envoyproxy.io/owning-gateway-namespace=default,gateway.envoyproxy.io/owning-gateway-name=eg -o jsnotallow='{.items[0].metadata.name}')

sudo kubectl -n envoy-gateway-system port-forward service/${ENVOY_SERVICE} 443:443

将 Envoy Gateway 的地址配置到 DNS 中,例如将 www.example.com 配置到 Envoy Gateway 的地址。

127.0.0.1 www.example.com

首先在浏览器中访问 Envoy Gateway 的地址,例如 https://www.example.com,Envoy Gateway 会根据 OIDC 的配置引导用户进行登录。浏览器会跳转到 Google 的登录页面。

图片图片

输入 Google 账户的用户名和密码,登录成功后,会跳转到应用的首页。

图片图片

总结

单点登录(SSO)简化了用户体验,使用户能够在访问多个应用时只需一次登录。但是,实现单点登录并不容易,需要应用程序实现和认证服务器的交互逻辑,增加了应用程序的开发工作量。Envoy Gateway 在最新版本中的安全策略中提供了 OpenID Connect (OIDC) 的能力,采用 Envoy Gateway 的安全策略,让应用程序无需修改任何代码即可轻松实现基于 OIDC 的单点登录(SSO)。

参考链接

  1. 1. OpenID Connect (OIDC) ¹:https://openid.net/specs/openid-connect-core-1_0.html
  2. 2. OAuth 2.0 ²:https://datatracker.ietf.org/doc/html/rfc6749
  3. 3. JSON Web Token (JWT)³:https://jwt.io
  4. 4. 阮一峰:OAuth 2.0 介绍⁴:https://www.ruanyifeng.com/blog/2019/04/oauth_design.html
  5. 5. Authorization Code Flow ⁵ :https://datatracker.ietf.org/doc/html/rfc6749#section-4.1
  6. 6. Google OpenID Connect 文档 ⁶:https://developers.google.com/identity/openid-connect/openid-connect
  7. 7. Envoy Gateway Quickstart ⁷ :https://gateway.envoyproxy.io/latest/user/quickstart
  8. 8. Secure Gateway ⁸:https://gateway.envoyproxy.io/latest/user/secure-gateways

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
P2P的自白|我不生产内容,我... 现在一提起P2P,人们就会联想到正在被有关部门“围剿”的互联网理财服务。×租宝事件使得劳...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...