java - 關于京東單點登錄認證的問題
問題描述
上圖是京東單點認證過程中的一個http請求。
他的過程是這樣的: 就是說當前為首頁www.jd.com ,然后通過發起跨域請求 向sso.jd.hk 發起認證。這個請求中攜帶了cookie同時response中也返回了cookie。 response中返回的 的cookie的domina設置為了一級域名。
有幾個問題不解,
(1)這里是跨域請求, 為什么request中攜帶了cookie?這個可以嗎 我看了其他朋友說是可以攜帶cookie的
比如 http://blog.csdn.net/wzl002/a... 跨域Ajax請求時是否帶Cookie的設置
但是具體到京東,他是怎么處理的?
(2)response中設置了cookie,但是現在所在的域名并不是jd.hk,而是www.jd.com ,這個能設置嗎具體到到京東是怎么做的
(3) response中有設置p3p,問題2中所提到的問題是通過這個實現的嗎?
(4)p3p 可以參考 http://blog.csdn.net/ghj1976/...
文章提到: 采用 P3P 之后,您可以設置瀏覽器自動偵測網站是否:收集個人標識信息、使用這些信息創建用戶檔案、或允許到訪者拒絕數據收集。具備 P3P 能力的瀏覽器具有一些可供您選擇的默認選項。 或者您也可以通過回答問題的方式(例如您愿意分享哪些數據、愿意接受哪些類型的 Cookie 文件)自定義您的設置。 當您在 Web 瀏覽時,這個軟件會判斷您的隱私權偏好選項是否與網站的數據收集做法匹配。
我的理解是: 具備p3p功能的瀏覽器 可以檢測到 跨域寫cookie的情況,通過與用戶交互的方式詢問用戶同不同意跨域寫cookie? 類似于經常出現的網頁 alter 提示交互????這個理解感覺不太合理呀,
各位說兩句(^-^)
問題解答
回答1:搞清楚域名和主機的區別。比如www.jd.com是主機名,不是域名,jd.com是域名。在下圖中,如果勾選了hostOnly,則此cookie只在此主機上起作用,換一個主機名www1.jd.com就不起作用了。但如果沒有勾選hostOnly,則此cookie在此域名下的任意主機上都是有效的,即使創建此cookie時是在www.jd.com上,但是在www1.jd.com上依然可以讀取到此cookie,也就是說,當瀏覽器訪問www1.jd.com時,會把這個cookie作為request的一部分發送給服務器。
Ajax的跨域與此不同。Ajax混淆了域名和主機的區別。在Ajax看來,只要不是在同一主機上發起的請求,都算跨域。比如從www.jd.com上發起一個ajax請求訪問www1.jd.com上的內容,這也算跨域。嚴格來說,這只算跨主機,不能算跨域,但是由于歷史原因,現在一直是這么定義的,所以也沒有辦法改正過來了。
回答2:我的建議是自己設計token驗證方式,cookie和http請求回復只是傳遞token的方式。如果你在redis/memcached里存這個token,所有節點都可以通過token查詢到當前狀態(是否已驗證),或者獨立寫個服務提供驗證也是一樣的道理。sso.jd.hk用cookie是為了保存驗證token和時間戳之類的信息。
token無需保密,直接回復token即可。這種模式同樣適合于websocket驗證。
常用的計算方法:token = sha1(數據ID+過期時間戳+驗證密碼)
把token,數據ID,過期時間戳都送給客戶,往其它服務發請求的時候附上這3個信息,因為只有服務器知道驗證密碼,這樣就可以驗證請求是否來源于另外的服務。AWS資源驗證方式和這個類似,只不過把驗證密碼換成了你的API密匙而已。
相關文章:
1. python - 獲取到的數據生成新的mysql表2. 為什么python中實例檢查推薦使用isinstance而不是type?3. mysql里的大表用mycat做水平拆分,是不是要先手動分好,再配置mycat4. window下mysql中文亂碼怎么解決??5. sass - gem install compass 使用淘寶 Ruby 安裝失敗,出現 4046. python - (初學者)代碼運行不起來,求指導,謝謝!7. 為啥不用HBuilder?8. python - flask sqlalchemy signals 無法觸發9. python的文件讀寫問題?10. javascript - js 對中文進行MD5加密和python結果不一樣。
