目前正在研究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是如何辦到的?
一般這樣的招倒是有很多,我就列出幾招說明
1.第三連結方式:
一般這樣的招式是,會統一依一個域名為主。所有的登入資訊都是透過它來處理。
2.同步方式:
無論在任何地方登入,其它位置也會背景同時處理。也就是在登入的同時也順便登入其它地方了。
很多人有這種需求, 這篇解釋了 Google 的作法:
Automatic cookie single sign on on multiple domains - like google
還有這篇不同的作法:
How youtube gets logged in to gmail account without getting redirected?
下面這是我的作法給你參考一下:
當然這中間傳遞的訊息要自己加密並具失效時限與使用次數,這邊就不多做解釋。