摘要:初衷缘起最近在构思一件事情,使用实现授权的要测试,动手敲代码最实际,但是,思考也是不能少的,否则也只是复制粘贴代码。通过对比,微博开放平台会相对简单点,因为微信有环境的限制。在阅读微博开放平台的登录授权接口时,发现要填写一个授权的回调。
初衷&缘起
最近在构思一件事情,使用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里存放用户的标志字段,在其他入口地址根据是否存在用户的标志字段来判断是否需要重新认证,就没问题了。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/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的工作原理 前面已经专门发过...
阅读 3442·2021-11-18 10:02
阅读 1590·2021-10-12 10:12
阅读 2949·2021-10-09 09:53
阅读 4714·2021-09-09 09:34
阅读 761·2021-09-06 15:02
阅读 2755·2021-08-05 10:02
阅读 3113·2019-08-30 15:44
阅读 3106·2019-08-28 18:04