token租约过期是什么意思思

Spring security深入使用(3)
& & & &&& & &
记得我Remember-me验证
  这是指网站能够记住会话之间主要的标识。Spring通过发送一个cookie到成功进行身份验证的浏览器,在Cookie中是如下:
  base64(username + &:& + expirationTime + &:& + md5Hex(username + &:& + expirationTime + &:& password + &:& + key));
  当浏览器发出下一个请求到服务器,它也随之发送这个cookie。Spring执行以下操作:
(一)从后端为给定的用户名获取密码
(二)根据uername获取从数据库中pasword,并计算用户名 密码,expirationTime和key的md5Hex,并比较它在cookie的值
(三)如果它们匹配 - 成功登录!如果不匹配,那么你已经提供的伪造Cookie或用户名/密码/密钥中的一个发生了变化。
激活&remember-me&通过http下面的配置:
&sec:http&
&!-- Other filter declarations here --&
&sec:remember-me key=&myAppKey&/&
&/sec:http&
有一点要注意的是,有一个潜在的安全问题在这里,令牌可以被捕获并可能被滥用,因为它是有效的,直到它过期。使用滚动令牌可避免。这里是如何实现基于令牌的记得我的服务:
access-decision-manager-ref=&accessDecisionManager&&
&& &!-- Other filter declarations here --&
&& &remember-me
services-alias=&rememberMeService&
data-source-ref=&dataSource&/&
&& &!-- &remember-me
data-source-ref=&dataSource& key=&pramati&/& --&
&/sec:http&
id=&tokenRepository&
class=&org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl&&
&& &property
name=&dataSource& ref=&dataSource&/&
&& &property
name=&createTableOnStartup& value=&true&/&
id=&rememberMeService&
class=&org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices&&
&& &property
name=&userDetailsService& ref=&userDetailsService&/&
&& &property name=&tokenRepository&
ref=&tokenRepository&/&
( a)在数据库中必须创建新表persistent_logins,因为我们已经指定& createTableOnStartup '在构造& tokenRepository &时 。下面是SQL创建表:
create table persistent_logins (
username varchar(64) not null,
series varchar(64) primary key,
token varchar(64) not null,
last_used timestamp not null);
( b)我们没有更多的定义我们自己的安全令牌。 Spring会自动生成令牌,并把persistent_tokens表更新。当用户从一个浏览器通过选择&记住我&的选项登录时,创建本表的一条记录,下一次用户从同一个浏览器登录时,用户会被自动记录,并将在数据库中的令牌值更改为一个新的值,但该系列值保持不变。假设现在用户从不同的浏览器转而选择记住我登录时,一个新的记录将为该浏览器创建。当他访问从浏览器访问应用程序时,后续更新会发生。
  因此,使用这种方法的好处是,攻击者将只能使用一个偷来的cookie,一直到受害者用户下一次访问应用程序之前,而不是非动态令牌时需要记住cookie的完整生命周期。当受害者接下来访问网站,他将使用相同的cookie 。这时 Spring会抛出一个CookieTheftException ,它可以用来通知盗窃发生的用户。
下面是为安全链的自定义过滤器:
&sec:custom-filter
position=&REMEMBER_ME_FILTER& ref=&rememberMeFilter& /&
id=&rememberMeFilter&
class=&org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter&&
& &property
name=&rememberMeServices& ref=&rememberMeServices&/&
& &property
name=&authenticationManager& ref=&theAuthenticationManager&
id=&tokenRepository&
class=&org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl&&
&& &property
name=&dataSource& ref=&dataSource&/&
&& &property
name=&createTableOnStartup& value=&false&/&
id=&rememberMeServices&
class=&org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices&&
&& &property
name=&userDetailsService& ref=&userDetailsService&/&
&& &property name=&tokenRepository&
ref=&tokenRepository&/&
id=&rememberMeAuthenticationProvider&
class=&org.springframework.security.authentication.rememberme.RememberMeAuthenticationProvider&/&
并发会发管理
假设我们不希望用户在应用的同时多个地方登录,下面是我们如何做到这一点:
&sec:http&
&!-- Other filter declarations here --&
&sec:session-management
session-authentication-error-url=&/login.jsp?error=alreadyLoggedin&
&sec:concurrency-control max-sessions=&1&
error-if-maximum-exceeded=&true&
&&&&&&&&&&&&& expired-url=&/login.jsp?error=alreadyLoggedin&/&
&/sec:session-management&
&/sec:http&
或者我们在web.xml中定义监听者,当用户登出以后发出一个事件org.springframework.security.core.session.SessionDestroyedEvent:
&listener&
&listener-class&
org.springframework.security.web.session.HttpSessionEventPublisher
&/listener-class&
&/listener&
Spring使用类似于我们一直在讨论的安全过滤器。除此之外,还采用ApplicationEvents。当Spring看到所需要的并发控制,它可以维持与主要关联会话列表。Map结构看起来像(在org.springframework.security.core.session.SessionRegistryImpl实际定义):
ConcurrentMap&Object,Set&String&& principals =
new ConcurrentHashMap&Object,Set&String&&();
这里映射的键是用户对象,值设置为与它相关联的会话ID。所以,当这个数据集的大小超过在&concurrency-control&元素中定义MAX-会话的值将引发异常。当Spring看到定义的并发控制元件,SessionRegistryImpl(Map的定义地方)将其内部ConcurrentSessionControlStrategy注入UsernamePasswordAuthenticationFilter。当用户认证成功,Spring放入Map一条记录。
当用户注销时,在web.xml中定义的侦听器将发出SessionDestroyedEvent,SessionRegistryImpl侦听此事件,并从维持map中删除会话ID条目。没有删除掉,用户将永远无法重新登录,即使他们登出另一个会话或会话超时。因此,这里是&concurrency-control&等效的配置:
&sec:http&
&sec:custom-filter position=&CONCURRENT_SESSION_FILTER&
ref=&concurrencyFilter& /&
&sec:custom-filter position=&FORM_LOGIN_FILTER&
ref=&myAuthFilter& /&
&!-- Other filter declarations here --&
&sec:session-management session-authentication-strategy-ref=&sessionAuthenticationStrategy&/&
&/sec:http&
&bean id=&concurrencyFilter&
class=&org.springframework.security.web.session.ConcurrentSessionFilter&&
&&property name=&sessionRegistry&
ref=&sessionRegistry& /&
&&property name=&expiredUrl& value=&/session-expired.htm&
&bean id=&myAuthFilter&
class=&org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter&&
&property name=&sessionAuthenticationStrategy&
ref=&sessionAuthenticationStrategy& /&
&property name=&authenticationManager&
ref=&authenticationManager& /&
id=&sessionAuthenticationStrategy&
class=&org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy&&
&constructor-arg name=&sessionRegistry& ref=&sessionRegistry&
&property name=&maximumSessions& value=&1& /&
&bean id=&sessionRegistry&
class=&org.springframework.security.core.session.SessionRegistryImpl&
| 网站地图 | 设为首页access token已过期_百度知道
access token已过期
怎么办。。
提问者采纳
需要用这些新的去替换掉关联表中的数据需要重新获取code。如果刷新取到了新的accesstoken。即要重新调用授权界面、expirein。需要用refreshtoken刷新accesstoken、refreshtoken。建议每次登陆的时候都用refreshtoken去刷新一次accesstoken,然后得到access_token
提问者评价
很复杂额,不过还是谢谢,,
其他类似问题
access的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁access token过期之后怎么处理,有refresh token的接口吗
- 为你的成功做乘法
access token过期之后怎么处理,有refresh token的接口吗
目前没有 刷新token的接口你可以引导用户重新授权
相关知识等待您来回答
该问题来自:QQ互联,为你的成功做乘法硬件领域专家管理员帮忙看看:欢乐嘉年华Token已经过期是什么意思?我接_百度知道活动吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:5,260贴子:
管理员帮忙看看:欢乐嘉年华Token已经过期是什么意思?我接收藏
管理员帮忙看看:欢乐嘉年华Token已经过期是什么意思?我接了一桶金币,结果提示这个。后面,游戏币也被消耗了。
1楼 12:52&|
相关的贴子6615750126相关的图贴
我也遇到这个情况,接了好多,但是金币没增加
2楼 16:55&|
官方已经转交给技术,有答复,会通知的。给您造成了不便,请谅解。
收起回复3楼 10:14&|
奶奶的!我有三次,是这样的情况。给我的情况也转一下《官方已经转交给技术》吧!
4楼 15:18&|
登录百度帐号我的游戏推荐游戏
后查看最近玩过的游戏
内&&容:使用签名档&&
想了解更多关于 ”百度知道活动“的信息,请&或C#微信公众平台开发―access_token的获取存储与更新
一、什么是access_token?
& & access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_token失效。由于获取access_token的api调用次数非常有限,建议开发者全局存储与更新access_token,频繁刷新access_token会导致api调用受限,影响自身业务。
二、要解决的问题
1、如何获取access_token。
2、由于access_token的有效期为7200秒,即2小时,并且重复获取将导致上次获取的access_token失效,获取access_token的api调用次数非常有限,所以要解决如何全局存储与更新access_token。
1、将access_token存储在中。
2、何时更新access_token呢?当access_token失效的时候更新,那么怎么判断access_token有没有失效呢?使用当前的access_token请求微信接口,获取自定义菜单,如果返回的errcode为42001,则说明access_token已经失效,这时再重新获取access_token。
四、代码:
1、Http请求代码(HttpRequestUtil类):
#region 请求Url,不发送数据
/// &summary&
/// 请求Url,不发送数据
/// &/summary&
public static string RequestUrl(string url)
& & return RequestUrl(url, &POST&);
#endregion
#region 请求Url,不发送数据
/// &summary&
/// 请求Url,不发送数据
/// &/summary&
public static string RequestUrl(string url, string method)
& & // 设置参数
& & HttpWebRequest request = WebRequest.Create(url) as HttpWebR
& & CookieContainer cookieContainer = new CookieContainer();
& & request.CookieContainer = cookieC
& & request.AllowAutoRedirect =
& & request.Method =
& & request.ContentType = &text/&;
& & request.Headers.Add(&charset&, &utf-8&);
& & //发送请求并获取相应回应数据
& & HttpWebResponse response = request.GetResponse() as HttpWebR
& & //直到request.GetResponse()程序才开始向目标网页发送Post请求
& & Stream responseStream = response.GetResponseStream();
& & StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
& & //返回结果网页(html)代码
& & string content = sr.ReadToEnd();
#endregion
2、辅助方法(Tools类):
namespace SWX.Utils
& & /// &summary&
& & /// 工具类
& & /// &/summary&
& & public class Tools
& & & & #region 获取Json字符串某节点的值
& & & & /// &summary&
& & & & /// 获取Json字符串某节点的值
& & & & /// &/summary&
& & & & public static string GetJsonValue(string jsonStr, string key)
& & & & & & string result = string.E
& & & & & & if (!string.IsNullOrEmpty(jsonStr))
& & & & & & {
& & & & & & & & key = &\&& + key.Trim('&') + &\&&;
& & & & & & & & int index = jsonStr.IndexOf(key) + key.Length + 1;
& & & & & & & & if (index & key.Length + 1)
& & & & & & & & {
& & & & & & & & & & //先截逗号,若是最后一个,截&}&号,取最小值
& & & & & & & & & & int end = jsonStr.IndexOf(',', index);
& & & & & & & & & & if (end == -1)
& & & & & & & & & & {
& & & & & & & & & & & & end = jsonStr.IndexOf('}', index);
& & & & & & & & & & }
& & & & & & & & & & result = jsonStr.Substring(index, end - index);
& & & & & & & & & & result = result.Trim(new char[] { '&', ' ', '\'' }); //过滤引号或空格
& & & & & & & & }
& & & & & & }
& & & & & &
& & & & #endregion
3、判断access_token是否过期(WXApi类):
#region 验证Token是否过期
/// &summary&
/// 验证Token是否过期
/// &/summary&
public static bool TokenExpired(string access_token)
& & string jsonStr = HttpRequestUtil.RequestUrl(string.Format(&https://api./cgi-bin/menu/get?access_token={0}&, access_token));
& & if (Tools.GetJsonValue(jsonStr, &errcode&) == &42001&)
#endregion
4、请求接口,获取access_token(WXApi类):
#region 获取Token
/// &summary&
/// 获取Token
/// &/summary&
public static string GetToken(string appid, string secret)
& & string strJson = HttpRequestUtil.RequestUrl(string.Format(&https://api./cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}&, appid, secret));
& & return Tools.GetJsonValue(strJson, &access_token&);
#endregion
5、全局存储与更新access_token(AdminUtil类):
#region 获取access_token
/// &summary&
/// 获取access_token
/// &/summary&
public static string GetAccessToken(PageBase page)
& & string access_token = string.E
& & UserInfo user = GetLoginUser(page);
& & if (user != null)
& & & & if (string.IsNullOrWhiteSpace(user.access_token)) //尚未保存过access_token
& & & & & & access_token = WXApi.GetToken(user.AppID, user.AppSecret);
& & & & else
& & & & & & if (WXApi.TokenExpired(user.access_token)) //access_token过期
& & & & & & {
& & & & & & & & access_token = WXApi.GetToken(user.AppID, user.AppSecret);
& & & & & & }
& & & & & & else
& & & & & & {
& & & & & & & & return user.access_
& & & & & & }
& & & & MSSQLHelper.ExecuteSql(string.Format(&update SWX_Config set access_token='{0}' where UserName='{1}'&, access_token, user.UserName));
& & return access_
#endregion
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。}

我要回帖

更多关于 token是什么意思 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信