成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Envoy Gateway:十分鐘搞定單點(diǎn)登錄(SSO)!

開發(fā) 前端
單點(diǎn)登錄(SSO)簡(jiǎn)化了用戶體驗(yàn),使用戶能夠在訪問多個(gè)應(yīng)用時(shí)只需一次登錄。但是,實(shí)現(xiàn)單點(diǎn)登錄并不容易,需要應(yīng)用程序?qū)崿F(xiàn)和認(rèn)證服務(wù)器的交互邏輯,增加了應(yīng)用程序的開發(fā)工作量。

單點(diǎn)登錄(SSO)簡(jiǎn)化了用戶體驗(yàn),使用戶能夠在訪問多個(gè)應(yīng)用時(shí)只需一次登錄。這提高了用戶滿意度,減少了密碼遺忘的風(fēng)險(xiǎn),同時(shí)增強(qiáng)了安全性。但是,實(shí)現(xiàn)單點(diǎn)登錄并不容易,需要應(yīng)用程序?qū)崿F(xiàn)和認(rèn)證服務(wù)器的交互邏輯,增加了應(yīng)用程序的開發(fā)工作量。Envoy Gateway 在最新版本中的安全策略中提供了 OpenID Connect (OIDC) 的能力,采用 Envoy Gateway,無需對(duì)應(yīng)用做任何修改,在十分鐘內(nèi)即可立刻實(shí)現(xiàn)單點(diǎn)登錄。

什么是單點(diǎn)登錄(SSO) ?

SSO 是 英文 Single Sign-On 的縮寫,翻譯為中文即為單點(diǎn)登錄。當(dāng)采用單點(diǎn)登錄之后,用戶只需要登錄一次,就可以訪問多個(gè)應(yīng)用系統(tǒng)。SSO 通常由一個(gè)獨(dú)立的身份管理系統(tǒng)來完成,該系統(tǒng)為每個(gè)用戶分配一個(gè)全局唯一的標(biāo)識(shí),用戶在登錄時(shí),只需要提供一次身份認(rèn)證,就可以訪問所有的應(yīng)用系統(tǒng)。我們?cè)谑褂靡恍┚W(wǎng)站時(shí),經(jīng)常會(huì)看到“使用微信登錄”、“使用 Google 賬戶登錄”等按鈕,這些網(wǎng)站就是通過 SSO 來實(shí)現(xiàn)的。

采用單點(diǎn)登錄有以下幾個(gè)好處:

  • ? 用戶只需要登錄一次,就可以訪問多個(gè)應(yīng)用系統(tǒng),不需要為每個(gè)應(yīng)用系統(tǒng)都單獨(dú)登錄。
  • ? 應(yīng)用系統(tǒng)不需要自己實(shí)現(xiàn)用戶認(rèn)證,只需將認(rèn)證工作交給單點(diǎn)登錄系統(tǒng),可以大大減少應(yīng)用系統(tǒng)的開發(fā)工作量。

圖片圖片

什么是 OpenID Connect (OIDC) ?

SSO 通常是通過 OpenID Connect (OIDC) 1 來實(shí)現(xiàn)的。OIDC 是一個(gè)基于 OAuth 2.0 2 協(xié)議之上的身份認(rèn)證協(xié)議。

OAuth 2.0 協(xié)議本身是一個(gè)授權(quán)協(xié)議,OAuth 2.0 協(xié)議中的授權(quán)服務(wù)器(Authorization Server)負(fù)責(zé)對(duì)用戶進(jìn)行身份認(rèn)證,認(rèn)證成功后,授權(quán)服務(wù)器會(huì)向客戶端頒發(fā)一個(gè)訪問令牌(Access Token),客戶端可以使用該令牌來訪問該用戶的受保護(hù)的資源。例如用戶可以通過 OAuth 2.0 授權(quán)一個(gè)第三方應(yīng)用訪問其 Github 賬號(hào)下的代碼庫。Access Token 是一個(gè)透明的字符串,只有授權(quán)服務(wù)器才知道如何解讀。客戶端會(huì)在訪問受保護(hù)資源時(shí)帶上 Acces Token,授權(quán)服務(wù)器根據(jù) Access Token 來判斷該請(qǐng)求是否有訪問指定資源的權(quán)限。Access Token 只用于對(duì)資源訪問進(jìn)行授權(quán),其中并沒有用戶身份信息。

OIDC 通過在 OAuth 2.0 協(xié)議之上增加了一個(gè) ID Token 來實(shí)現(xiàn)身份認(rèn)證。OIDC 的認(rèn)證過程和 OAuth 2.0 的認(rèn)證過程是一樣的,只是認(rèn)證服務(wù)器在對(duì)用戶認(rèn)證后向客戶端頒發(fā)的是一個(gè) ID Token 而不是 Access Token。ID Token 是一個(gè) JSON Web Token (JWT) 3,JWT Token 是一個(gè)標(biāo)準(zhǔn)的格式,其中包含了用戶的身份信息,例如用戶的唯一標(biāo)識(shí),用戶名,郵箱等,并且可以通過認(rèn)證服務(wù)器的公鑰進(jìn)行驗(yàn)證,因此可以代表登錄的用戶身份。OIDC 通過 ID Token 來實(shí)現(xiàn)身份認(rèn)證,從而實(shí)現(xiàn)了單點(diǎn)登錄。

備注:由于篇幅有限,本文對(duì) OAuth 2.0 只做簡(jiǎn)單介紹,如果感興趣的話,可以移步阮一峰老師的 OAuth 2.0 介紹 ? 系列文章進(jìn)一步了解協(xié)議的原理。

Envoy Gateway OIDC 認(rèn)證過程

Envoy Gateway 在最新版本中的安全策略中提供了 OIDC 的能力,可以通過 OIDC 來實(shí)現(xiàn)單點(diǎn)登錄。OIDC 標(biāo)準(zhǔn)支持通過 OAuth 2.0 中的 Authorization Code Flow,Implicit Flow,Hybrid Flow 三種方式來進(jìn)行身份認(rèn)證。Envoy Gateway 采用了其中最安全,也是最常用的 Authorization Code Flow ?。下圖展示了 Envoy Gateway OIDC 的認(rèn)證過程。

圖片圖片

  • ? 當(dāng)用戶訪問一個(gè)需要進(jìn)行 OIDC 認(rèn)證的 HTTPRoute 時(shí),Envoy Gateway 會(huì)檢查請(qǐng)求中是否有代表用戶身份的 ID Token,如果沒有,或者 Token 已經(jīng)過期,則會(huì)將請(qǐng)求重定向到 OIDC Provider 的認(rèn)證頁面。
  • ? 用戶在 OIDC Provider 的認(rèn)證頁面輸入用戶名和密碼等身份信息進(jìn)行認(rèn)證。認(rèn)證成功后,OIDC Provider 會(huì)將用戶重定向到 Envoy Gateway 的回調(diào)地址,并且?guī)弦粋€(gè) Authorization Code。
  • ? Envoy Gateway 收到 OIDC Provider 的回調(diào)請(qǐng)求后,會(huì)將 Authorization Code 發(fā)送給 OIDC Provider,OIDC Provider 根據(jù) Authorization Code 生成一個(gè) ID Token,并將 ID Token 返回給 Envoy Gateway。
  • ? Envoy Gateway 收到 ID Token 后,會(huì)將 ID Token 保存在一個(gè) Cookie 中,并將請(qǐng)求重定向到原來的 HTTPRoute。
  • ? 當(dāng)用戶再次訪問該 HTTPRoute 時(shí),Envoy Gateway 會(huì)從 Cookie 中獲取 ID Token,驗(yàn)證該 ID Token 合法,并且未過期后,Envoy Gateway 會(huì)將請(qǐng)求轉(zhuǎn)發(fā)給后端服務(wù)。

從圖中可以看到,雖然 OIDC 單點(diǎn)登錄的過程比較復(fù)雜,但都是由 Envoy Gateway 來完成的。對(duì)于應(yīng)用程序來說,這個(gè)過程其實(shí)是無感知的,應(yīng)用程序無需修改任何代碼,就可以實(shí)現(xiàn)單點(diǎn)登錄。

采用 Envoy Gateway 為應(yīng)用實(shí)現(xiàn)單點(diǎn)登錄

采用 Envoy Gateway 可以簡(jiǎn)化應(yīng)用關(guān)于用戶登錄的實(shí)現(xiàn),應(yīng)用程序無需在代碼中實(shí)現(xiàn)和 OIDC Provicer 交互的相關(guān)邏輯,只需要在 Envoy Gateway 的安全策略中配置 OIDC 的相關(guān)參數(shù),在十分鐘內(nèi)可實(shí)現(xiàn)應(yīng)用的 OIDC SSO。下面我們通過一個(gè)例子來演示如何在 Envoy Gateway 中配置 OIDC。

配置 OIDC Provider

Envoy Gateway 支持所有實(shí)現(xiàn)了 OIDC 標(biāo)準(zhǔn)的 Identify Provider,包括 Google、微軟、Auth0、Okta、微信、微博等等。下面我們以 Google 賬戶登錄為例介紹如何為 Envoy Gateway 配置 OIDC SSO。

首先需要參照 Google 的 OpenID Connect 文檔 ? Google Cloud Platform 中創(chuàng)建一個(gè) OAuth Client ID。

打開 Google Cloud Console 的 Credentials 界面,點(diǎn)擊 Create Credentials -> OAuth client ID,然后選擇 Web application,輸入應(yīng)用的名稱,設(shè)置 Authorized redirect URLs 為 https://www.example.com/oauth2/callback,然后點(diǎn)擊 Create 按鈕創(chuàng)建 OAuth Client ID。

圖片圖片

備注:Envoy Gateway 采用 %REQ(x-forwarded-proto)%://%REQ(:authority)%/oauth2/callback 作為默認(rèn)的 OIDC 回調(diào)地址,因此需要將 Authorized redirect URLs 設(shè)置為 https://www.example.com/oauth2/callback。

創(chuàng)建成功后,會(huì)彈出一個(gè)頁面顯示創(chuàng)建的 OAuth client 的信息,記錄下其中的 Client ID 和 Client Secret,這兩個(gè)值將會(huì)用于后面的 Envoy Gateway 安全策略配置中。

圖片圖片

配置 Envoy Gateway 安全策略

首先參照 Envoy Gateway Quickstart ? 安裝 Envoy Gateway 和例子程序。根據(jù) OIDC 規(guī)范的建議,Envoy Gateway 要求配置 OIDC 的 Listener 采用 HTTPS 協(xié)議,因此前參照 Secure Gateway ?為 Envoy Gateway 配置 HTTPS。

創(chuàng)建一個(gè) Kubernetes Secret,用于存儲(chǔ) OAuth Client 的 Client Secret。

注意將 ${CLIENT_SECRET} 替換為上面創(chuàng)建的 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 中配置一個(gè)安全策略,該安全策略用于配置 OIDC SSO 的相關(guān)參數(shù)。

注意將 ${CLIENT_ID} 替換為上面創(chuàng)建的 OAuth Client 的 Client ID。

cat <<EOF | kubectl apply -f -
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: SecurityPolicy
metadata:
  name: oidc-example
spec:
  targetRef:
    group: gateway.networking.k8s.io
    kind: HTTPRoute
    name: backend
  oidc:
    provider:
      issuer: "https://accounts.google.com"
    clientID: "${CLIENT_ID}.apps.googleusercontent.com"
    clientSecret:
      name: "my-app-client-secret"
EOF

上面短短十來行配置就會(huì)將 OIDC SSO 應(yīng)用到名為 backend 的 HTTPRoute 上。這樣,當(dāng)客戶端請(qǐng)求訪問該 HTTPRoute 時(shí),就會(huì)被重定向到 Google 頁面進(jìn)行用戶驗(yàn)證 。除了 HTTPRoute,Envoy Gateway 還支持將 SecurityPolicy 應(yīng)用到 Gateway 上,只要將 targetRef 指向 Gateway 即可。

驗(yàn)證單點(diǎn)登錄

如果集群有對(duì)外暴露的 LoadBalancer,可以直接通過 LoadBalancer 的地址訪問 Envoy Gateway。如果集群沒有對(duì)外暴露的 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 會(huì)根據(jù) OIDC 的配置引導(dǎo)用戶進(jìn)行登錄。瀏覽器會(huì)跳轉(zhuǎn)到 Google 的登錄頁面。

圖片圖片

輸入 Google 賬戶的用戶名和密碼,登錄成功后,會(huì)跳轉(zhuǎn)到應(yīng)用的首頁。

圖片圖片

總結(jié)

單點(diǎn)登錄(SSO)簡(jiǎn)化了用戶體驗(yàn),使用戶能夠在訪問多個(gè)應(yīng)用時(shí)只需一次登錄。但是,實(shí)現(xiàn)單點(diǎn)登錄并不容易,需要應(yīng)用程序?qū)崿F(xiàn)和認(rèn)證服務(wù)器的交互邏輯,增加了應(yīng)用程序的開發(fā)工作量。Envoy Gateway 在最新版本中的安全策略中提供了 OpenID Connect (OIDC) 的能力,采用 Envoy Gateway 的安全策略,讓應(yīng)用程序無需修改任何代碼即可輕松實(shí)現(xiàn)基于 OIDC 的單點(diǎn)登錄(SSO)。

參考鏈接

  1. 1. OpenID Connect (OIDC) 1:https://openid.net/specs/openid-connect-core-1_0.html
  2. 2. OAuth 2.0 2:https://datatracker.ietf.org/doc/html/rfc6749
  3. 3. JSON Web Token (JWT)3: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
責(zé)任編輯:武曉燕 來源: 大兵聊云原生
相關(guān)推薦

2023-04-12 11:18:51

甘特圖前端

2023-11-30 10:21:48

虛擬列表虛擬列表工具庫

2023-12-08 13:19:00

前端Reactour流行庫

2020-12-17 06:48:21

SQLkafkaMySQL

2019-04-01 14:59:56

負(fù)載均衡服務(wù)器網(wǎng)絡(luò)

2023-12-13 13:26:41

2024-06-19 09:58:29

2021-09-07 09:40:20

Spark大數(shù)據(jù)引擎

2022-06-16 07:31:41

Web組件封裝HTML 標(biāo)簽

2023-12-21 11:39:47

2015-09-06 09:22:24

框架搭建快速高效app

2012-07-10 01:22:32

PythonPython教程

2024-05-13 09:28:43

Flink SQL大數(shù)據(jù)

2017-10-10 05:05:33

KerasRNN序列學(xué)習(xí)

2019-09-16 09:14:51

2009-10-09 14:45:29

VB程序

2023-07-15 18:26:51

LinuxABI

2024-11-07 16:09:53

2022-08-26 09:01:07

CSSFlex 布局

2023-11-09 14:44:27

Docker鏡像容器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩在线欧美 | 特级丰满少妇一级aaaa爱毛片 | 成人免费视频播放 | 夜夜草| h在线播放| 国产精品一二区 | aacc678成免费人电影网站 | 天天操天天干天天曰 | 国产精品久久久久久久岛一牛影视 | 鲁一鲁资源影视 | 一区二区三区精品视频 | 精品一区免费 | 欧美精品久久 | av网站免费在线观看 | 久久99精品久久久久久 | 欧美性猛片aaaaaaa做受 | 日韩精品免费视频 | 亚洲国产欧美在线 | 一区二区三区免费 | 国产一级免费视频 | 欧美在线一区二区三区 | 美女视频一区 | 久久九九99 | 国产成人小视频 | 国产乱码一二三区精品 | 草在线| 日韩一区二区在线观看视频 | 国产精品美女久久久久久久久久久 | 久久久精品影院 | 国产精品国产精品 | 成人av免费播放 | 国产91在线精品 | 人人看人人射 | 91国产精品 | 秋霞a级毛片在线看 | 久久综合色综合 | 日本免费一区二区三区 | 亚洲精品久久久久久宅男 | 国产一区2区 | 天天综合久久 | 亚洲欧美高清 |