iT邦幫忙

1

SSO(單點登入)跨網站如何取得狀態

taro 2019-05-07 08:53:301792 瀏覽

目前正在研究SSO單點登入,用的會是OAuth2.0的模式,但對於跨網站取得狀態有點疑問,希望各位高手能指點迷津,謝謝。

假設目前有兩個網站,domain name分別是web1.com.tw與web2.com.tw,但無論從哪一個網站點擊登入,都會跳轉到會員驗證的網站account.com.tw做登入。
當在account.com.tw登入成功後,會取得能換得token的code,並跳轉回原本的網站(web1/web2),再由網站後端用code去換得token,並寫入cookie,就達成登入狀態了。

假設我剛才已用web1達成登入了,但因為cookie寫入不能跨網域,當我載入web2時,該怎麼知道其實已經登入了呢?

有看過一種方法是每當載入web1/web2時,都先導向至account驗證網站確認狀態後再轉回,但現在網站常常不只在點擊登入時要確認會員狀態,可能網站中每一頁都需要會員目前的狀態,如果有登入的話還好,就可以取得token塞cookie了。但如果沒登入,就要每一頁都要跳轉到驗證網站確認到底有沒有登入,好像不是很好的解法。

也研究了一下google的方法,刻意找了youtube和google兩個共用帳號/不同domain的網站,觀察cookie的運作方式。
一開始先打開youtube,這頁的cookie看起來是這樣子的:

這時候我直接開啟新分頁https://myaccount.google.com/ 成功登入後
再開回原本youtube的分頁,這時的cookie會長這樣:

在我完全沒有重新整理的狀態下,youtube分頁被塞入了三個domain的cookie,而且都是同樣的值(應該是token)。
這邊有個疑問,youtube是怎麼被動知道已經登入,並且塞入cookie的呢?

而且跨域的方式應該是不能寫入不同domain的cookie的(.youtube.com/.google.com.tw/.google.com),這邊卻有3個不同domain的cookie,google是如何辦到的?

你有用非google的瀏覽器重新試過嘛?
試試看就知道了。
taro iT邦新手 5 級 ‧ 2019-05-07 09:31:22 檢舉
真的耶,我用edge試過了,的確沒有跨網域的cookie了,但是屬於youtube的cookie還是有被塞進來(在沒重新整理的狀態下)。
使用google瀏覽器,其帳號會儲存在你的瀏覽器上。
其實你如果瀏覽器不去做同步處理跟登入的話。
也是不會自動登入同步的。
畢竟是相關產業。其它瀏覽器才不會鳥他。
0
浩瀚星空
iT邦大師 1 級 ‧ 2019-05-07 09:21:50

一般這樣的招倒是有很多,我就列出幾招說明

1.第三連結方式:
一般這樣的招式是,會統一依一個域名為主。所有的登入資訊都是透過它來處理。

2.同步方式:
無論在任何地方登入,其它位置也會背景同時處理。也就是在登入的同時也順便登入其它地方了。

看更多先前的回應...收起先前的回應...
taro iT邦新手 5 級 ‧ 2019-05-07 09:51:21 檢舉

目前我是把登入資訊統一交給一個網站處理,但專案目前是沒辦法統一域名的狀態。 我的理解對嗎?

同步的話,你的概念是怎麼處理呢? 走websocket嗎?

fillano iT邦超人 1 級 ‧ 2019-05-07 11:07:31 檢舉

也許可以用iframe包account.com.tw來取得登入狀態。(因為沒需求所以我沒用過,不過可以試試看)

我早期也是用iframe的方式來處理的。在登入動作時。也順便同步其它域名的登入。
反正cookie是記錄在本機上。登入後給他記錄上去就行了。
這樣當去到該網站時就可以直接取用了。

不過說是這樣說啦,你本身也要注意好安全性就是了。
我後期已經不在用iframe的方式做同步了。

taro iT邦新手 5 級 ‧ 2019-05-08 15:54:06 檢舉

感謝 我目前是決定用ajax的方式,在登入後拿code或token傳輸給不同網域的網站,並且寫入code,其實作法有一點像iframe。

2
raytracy
iT邦大神 1 級 ‧ 2019-05-07 11:12:40

很多人有這種需求, 這篇解釋了 Google 的作法:
Automatic cookie single sign on on multiple domains - like google
還有這篇不同的作法:
How youtube gets logged in to gmail account without getting redirected?

froce iT邦大師 3 級 ‧ 2019-05-07 11:16:44 檢舉

天啊,這篇神佛都出來了。XD

raytracy iT邦大神 1 級 ‧ 2019-05-07 11:55:18 檢舉

樓上的才是真神, 到我這篇就不是了...
我只是一台 Google 過濾器而已...

taro iT邦新手 5 級 ‧ 2019-05-09 09:13:46 檢舉

感謝回復,我最後選擇類似第二篇的作法,只是我用ajax發送跨域請求後再塞入cookie。
第一篇的部分我觀察過google在登入帳號時,應該是沒實際跳轉到不同網域的網站的。

0
攻城屍
iT邦新手 5 級 ‧ 2019-05-07 13:45:59

下面這是我的作法給你參考一下:

  1. 使用者在 A 站台登入
  2. 轉瀏覽 B 站台時程式發現未登入,可利用 httpstatus code 302 轉導至 A 站台檢查登入狀態
  3. A 站台檢查後將結果也利用 302 的方式轉回 B 站台
  4. 檢查結果成功則寫入 cookie

當然這中間傳遞的訊息要自己加密並具失效時限與使用次數,這邊就不多做解釋。

taro iT邦新手 5 級 ‧ 2019-05-09 09:14:51 檢舉

我原本也是想這樣處理就好,但當有CDEFG站台,且網域不同時,會比較麻煩些。

我要發表回答

立即登入回答