java - 關(guān)于京東單點(diǎn)登錄認(rèn)證的問題
問題描述
上圖是京東單點(diǎn)認(rèn)證過程中的一個(gè)http請(qǐng)求。
他的過程是這樣的: 就是說當(dāng)前為首頁www.jd.com ,然后通過發(fā)起跨域請(qǐng)求 向sso.jd.hk 發(fā)起認(rèn)證。這個(gè)請(qǐng)求中攜帶了cookie同時(shí)response中也返回了cookie。 response中返回的 的cookie的domina設(shè)置為了一級(jí)域名。
有幾個(gè)問題不解,
(1)這里是跨域請(qǐng)求, 為什么request中攜帶了cookie?這個(gè)可以嗎 我看了其他朋友說是可以攜帶cookie的
比如 http://blog.csdn.net/wzl002/a... 跨域Ajax請(qǐng)求時(shí)是否帶Cookie的設(shè)置
但是具體到京東,他是怎么處理的?
(2)response中設(shè)置了cookie,但是現(xiàn)在所在的域名并不是jd.hk,而是www.jd.com ,這個(gè)能設(shè)置嗎具體到到京東是怎么做的
(3) response中有設(shè)置p3p,問題2中所提到的問題是通過這個(gè)實(shí)現(xiàn)的嗎?
(4)p3p 可以參考 http://blog.csdn.net/ghj1976/...
文章提到: 采用 P3P 之后,您可以設(shè)置瀏覽器自動(dòng)偵測(cè)網(wǎng)站是否:收集個(gè)人標(biāo)識(shí)信息、使用這些信息創(chuàng)建用戶檔案、或允許到訪者拒絕數(shù)據(jù)收集。具備 P3P 能力的瀏覽器具有一些可供您選擇的默認(rèn)選項(xiàng)。 或者您也可以通過回答問題的方式(例如您愿意分享哪些數(shù)據(jù)、愿意接受哪些類型的 Cookie 文件)自定義您的設(shè)置。 當(dāng)您在 Web 瀏覽時(shí),這個(gè)軟件會(huì)判斷您的隱私權(quán)偏好選項(xiàng)是否與網(wǎng)站的數(shù)據(jù)收集做法匹配。
我的理解是: 具備p3p功能的瀏覽器 可以檢測(cè)到 跨域?qū)慶ookie的情況,通過與用戶交互的方式詢問用戶同不同意跨域?qū)慶ookie? 類似于經(jīng)常出現(xiàn)的網(wǎng)頁 alter 提示交互????這個(gè)理解感覺不太合理呀,
各位說兩句(^-^)
問題解答
回答1:搞清楚域名和主機(jī)的區(qū)別。比如www.jd.com是主機(jī)名,不是域名,jd.com是域名。在下圖中,如果勾選了hostOnly,則此cookie只在此主機(jī)上起作用,換一個(gè)主機(jī)名www1.jd.com就不起作用了。但如果沒有勾選hostOnly,則此cookie在此域名下的任意主機(jī)上都是有效的,即使創(chuàng)建此cookie時(shí)是在www.jd.com上,但是在www1.jd.com上依然可以讀取到此cookie,也就是說,當(dāng)瀏覽器訪問www1.jd.com時(shí),會(huì)把這個(gè)cookie作為request的一部分發(fā)送給服務(wù)器。
Ajax的跨域與此不同。Ajax混淆了域名和主機(jī)的區(qū)別。在Ajax看來,只要不是在同一主機(jī)上發(fā)起的請(qǐng)求,都算跨域。比如從www.jd.com上發(fā)起一個(gè)ajax請(qǐng)求訪問www1.jd.com上的內(nèi)容,這也算跨域。嚴(yán)格來說,這只算跨主機(jī),不能算跨域,但是由于歷史原因,現(xiàn)在一直是這么定義的,所以也沒有辦法改正過來了。
回答2:我的建議是自己設(shè)計(jì)token驗(yàn)證方式,cookie和http請(qǐng)求回復(fù)只是傳遞token的方式。如果你在redis/memcached里存這個(gè)token,所有節(jié)點(diǎn)都可以通過token查詢到當(dāng)前狀態(tài)(是否已驗(yàn)證),或者獨(dú)立寫個(gè)服務(wù)提供驗(yàn)證也是一樣的道理。sso.jd.hk用cookie是為了保存驗(yàn)證token和時(shí)間戳之類的信息。
token無需保密,直接回復(fù)token即可。這種模式同樣適合于websocket驗(yàn)證。
常用的計(jì)算方法:token = sha1(數(shù)據(jù)ID+過期時(shí)間戳+驗(yàn)證密碼)
把token,數(shù)據(jù)ID,過期時(shí)間戳都送給客戶,往其它服務(wù)發(fā)請(qǐng)求的時(shí)候附上這3個(gè)信息,因?yàn)橹挥蟹?wù)器知道驗(yàn)證密碼,這樣就可以驗(yàn)證請(qǐng)求是否來源于另外的服務(wù)。AWS資源驗(yàn)證方式和這個(gè)類似,只不過把驗(yàn)證密碼換成了你的API密匙而已。
相關(guān)文章:
1. javascript - 獲取標(biāo)簽中的字符串2. javascript - 為什么我的vue里的router-link不起作用3. javascript - js 寫一個(gè)正則 提取文本中的數(shù)據(jù)4. javascript - vue子路由匹配渲染到頂級(jí)視圖層問題5. 算法 - python 給定一個(gè)正整數(shù)a和一個(gè)包含任意個(gè)正整數(shù)的 列表 b,求所有<=a 的加法組合6. javascript - 發(fā)現(xiàn)個(gè)奇怪的問題,寫的css動(dòng)畫當(dāng)我把標(biāo)簽頁收起時(shí)動(dòng)畫自動(dòng)暫停了7. javascript - js一個(gè)小的算法問題,找個(gè)好一點(diǎn)的答案。8. javascript - 新組成的數(shù)組打印出來出現(xiàn)問題,里面有對(duì)象,但長(zhǎng)度為空9. javascript - 關(guān)于Lazyload遇到的問題10. javascript - 如果根據(jù)參數(shù)給table中的tr綁定不同事件
