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