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