摘要:初衷緣起最近在構(gòu)思一件事情,使用實(shí)現(xiàn)授權(quán)的要測(cè)試,動(dòng)手敲代碼最實(shí)際,但是,思考也是不能少的,否則也只是復(fù)制粘貼代碼。通過(guò)對(duì)比,微博開放平臺(tái)會(huì)相對(duì)簡(jiǎn)單點(diǎn),因?yàn)槲⑿庞协h(huán)境的限制。在閱讀微博開放平臺(tái)的登錄授權(quán)接口時(shí),發(fā)現(xiàn)要填寫一個(gè)授權(quán)的回調(diào)。
初衷&緣起
最近在構(gòu)思一件事情,使用spring-boot + spring-security+oauth實(shí)現(xiàn)授權(quán)的demo;
要測(cè)試,動(dòng)手敲代碼最實(shí)際,但是,思考也是不能少的,否則也只是復(fù)制粘貼代碼。
測(cè)試oauth的第一步,肯定是先弄明白怎么請(qǐng)求授權(quán)服務(wù)器,怎么拿到code再拿到token。
所以第一步是創(chuàng)建一個(gè)能使用的“client”。通過(guò)對(duì)比,微博開放平臺(tái)會(huì)相對(duì)簡(jiǎn)單點(diǎn),因?yàn)槲⑿庞协h(huán)境的限制。
在閱讀微博開放平臺(tái)的登錄授權(quán)接口時(shí),發(fā)現(xiàn)要填寫一個(gè)授權(quán)的回調(diào)url。
那么疑問(wèn)就來(lái)了:
如果我的“client”應(yīng)用是一個(gè)類似公眾號(hào)的
比如:有多個(gè)菜單,點(diǎn)擊跳到不同的頁(yè)面,而這些頁(yè)面都需要先登錄微博授權(quán)
限制:用戶點(diǎn)擊登錄授權(quán)之后,回調(diào)的url是同一個(gè)
結(jié)果:那不管點(diǎn)擊那個(gè)菜單,最后都是跳到回調(diào)的頁(yè)面,多個(gè)菜單就形同虛設(shè)了
請(qǐng)注意,這里不是分析如何授權(quán)登錄,而是授權(quán)成功時(shí),如何跳到所點(diǎn)擊的入口(菜單)
假設(shè)(靜默授權(quán),就是不需要用戶點(diǎn)擊確認(rèn)):
我們的應(yīng)用(client)的域名是:web.client.com
client中有一個(gè)菜單是:web.client.com/ha
client中有個(gè)回調(diào)地址:web.client.com/receive
微博開發(fā)平臺(tái)的域名是:oauth.server.com
微博確認(rèn)授權(quán)接口地址是:oauth.server.com/test
過(guò)程:
訪問(wèn)client的任意菜單(web.client.com/ha)
client發(fā)現(xiàn)需要登錄微博授權(quán),將用戶重定向到oauth.server.com/test
微博確認(rèn)了用戶信息,把用戶重定向到web.client.com/receive,并帶上code
client接收到code,并且可以通過(guò)code拿到token并暫存。
問(wèn)題在于:最后一步,拿到code再拿到token后,如何跳到我們所點(diǎn)擊的入口(菜單)
猜測(cè)&實(shí)驗(yàn):session能否實(shí)現(xiàn)? 猜測(cè)思路session存放我們所點(diǎn)擊的入口(菜單),在接收code的回調(diào)接口中,在把用戶重定向到我們所點(diǎn)擊的入口菜單。
實(shí)驗(yàn)代碼 host配置兩個(gè)站點(diǎn)127.0.0.1 oauth.server.com 127.0.0.1 web.client.comweb.client.com接口
package com.lgh.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @Controller public class IndexController { @RequestMapping("/ha") public String index(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws Exception { System.out.println("/ha 請(qǐng)求,redirect:http://oauth.server.com/test"); System.out.println(session.getId()); System.out.println(request.getRequestURL()); session.setAttribute("entrance", request.getRequestURL()); return "redirect:http://oauth.server.com/test"; } @RequestMapping("ha2") public String index2(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws Exception { System.out.println("/ha2 請(qǐng)求,redirect:http://oauth.server.com/test"); System.out.println(session.getId()); System.out.println(request.getRequestURL()); session.setAttribute("entrance", request.getRequestURL()); return "redirect:http://oauth.server.com/test"; } @RequestMapping("/receive") public String receive(HttpServletRequest request, HttpServletResponse response, HttpSession session) { System.out.println("/receive請(qǐng)求, 返回haha.jsp"); System.out.println(session.getId()); System.out.println("code = " + request.getParameter("code")); System.out.println("入口地址:" + session.getAttribute("entrance")); return "haha"; } }oauth.server.com接口(php) 實(shí)驗(yàn)結(jié)果
第一次:web.client.com:8080/ha
第二次:web.client.com:8080/ha2
注意在測(cè)試兩個(gè)接口的中間,要徹底關(guān)閉瀏覽器,否則拿到的session是沒(méi)變的
再來(lái)思考下session的過(guò)期和時(shí)效
過(guò)期:一般會(huì)有默認(rèn)的過(guò)期時(shí)間,是由服務(wù)器的默認(rèn)配置的。
失效:一般都是瀏覽會(huì)話結(jié)束時(shí)失效(瀏覽會(huì)話結(jié)束是指:瀏覽器徹底關(guān)掉所有的tab,一個(gè)不留,有一個(gè)沒(méi)關(guān),瀏覽會(huì)話都沒(méi)結(jié)束)
腦殘測(cè)試 條件把client的兩個(gè)接口都設(shè)置session的過(guò)期時(shí)間:session.setMaxInactiveInterval(2);
server接口中,添加睡眠代碼:sleep(10);
結(jié)果由于session都過(guò)期了,server才返回code,此時(shí)拿到的session自然沒(méi)有東西啦
如果真的是多個(gè)菜單的場(chǎng)景,會(huì)存在一種情況:我點(diǎn)了一個(gè)菜單,退出來(lái),再點(diǎn)第二個(gè)菜單,session存的入口菜單就會(huì)覆蓋,這種情況會(huì)不會(huì)有問(wèn)題?
分析:
不同時(shí)刻關(guān)閉重新點(diǎn)擊菜單,造成的影響會(huì)有點(diǎn)點(diǎn)不一樣
如果我們?cè)谀玫絫oken之后,在session里存放用戶的標(biāo)志字段,在其他入口地址根據(jù)是否存在用戶的標(biāo)志字段來(lái)判斷是否需要重新認(rèn)證,就沒(méi)問(wèn)題了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69376.html
摘要:走出誤區(qū),我們來(lái)討論一下真正的過(guò)期策略吧。前面說(shuō)了,數(shù)據(jù)是否過(guò)期只與服務(wù)器有關(guān),此處在修改的過(guò)期策略配置三條紅線分別影響著的過(guò)期策略刪除幾率的分子刪除幾率的分母分鐘刪除一次一次終上所述默認(rèn)的過(guò)期機(jī)制為分鐘刪除一次,每個(gè)會(huì)話被刪除的幾率為。 首先說(shuō)一點(diǎn)新手認(rèn)識(shí)中常見(jiàn)的誤區(qū):關(guān)閉瀏覽器session就過(guò)期了。這種說(shuō)話是完全錯(cuò)誤的, session是否過(guò)期與客戶端如何操作沒(méi)什么必然關(guān)系,他只...
第一種回答 那么, 最常見(jiàn)的一種回答是: 設(shè)置Session的過(guò)期時(shí)間, 也就是session.gc_maxlifetime, 這種回答是不正確的, 原因如下: 首先, 這個(gè)PHP是用一定的概率來(lái)運(yùn)行session的gc的, 也就是session.gc_probability和session.gc_divisor(介紹參看 深入理解PHP原理之Session Gc的一個(gè)小概率Notice), 這...
摘要:使用的中間件是一個(gè)簡(jiǎn)潔的框架,把許多小功能都拆分成了中間件,用一個(gè)洋蔥模型保證了中間件豐富的可拓展性,我們要使用來(lái)保持登錄狀態(tài),就需要引用中間件。默認(rèn)是過(guò)期時(shí)間,以毫秒為單位計(jì)算。自動(dòng)提交到響應(yīng)頭。默認(rèn)是是否在快過(guò)期時(shí)刷新的有效期。 項(xiàng)目要用到登錄注冊(cè),就需要使用到Cookie和Session來(lái)保持登錄狀態(tài),于是就簡(jiǎn)單研究了一下 Cookie和Session的工作原理 前面已經(jīng)專門發(fā)過(guò)...
閱讀 3497·2021-11-18 10:02
閱讀 1627·2021-10-12 10:12
閱讀 3011·2021-10-09 09:53
閱讀 4909·2021-09-09 09:34
閱讀 898·2021-09-06 15:02
閱讀 2790·2021-08-05 10:02
閱讀 3154·2019-08-30 15:44
閱讀 3133·2019-08-28 18:04