不能马上测试的的问题
我尝试设置15秒时效,发现等了几分钟也没失效
需要覆盖默认值ClockSkew
改成0 就能立马测试出来了。
options.TokenValidationParameters = new TokenValidationParameters
{
//NameClaimType = JwtClaimTypes.Name,
//RoleClaimType = JwtClaimTypes.Role,
ValidateIssuer = true, //是否验证Issuer
ValidateAudience = true, //是否验证Audience
ValidateLifetime = true, //是否验证失效时间
RequireExpirationTime = true, //过期时间
ValidateIssuerSigningKey = true, //是否验证IssuerSigningKey
ValidAudience = audience,
ValidIssuer = issuer,
ClockSkew = TimeSpan.Zero,//方便立马测试是否错误
失效的处理。。
如果刚刚失效,代表用户此时是在线的,直接掉线有点太草率了。。
要设置距离那个时间应该有50分钟才算彻底掉线。
我的解决思路:
登录的时候返回一个过期时间,app每次发起请求判断是否快失效,快失效则重新访问接口获取token,而获取这个token恰好需要token验证也就是加上[Auth]
,只是刚好差一点点失效,
获取到了之后用新的token访问即可
总结:
临时在线失效 2小时,在这快到期范围内如果再次请求,那么再次刷新,token失效将又会被更新为3天。
长token失效3天。
[HttpGet("refreshToken")]
[Authorize]
public string refreshToken(string username)
{
string SecurityKey = mIConfiguration["SecurityKey"];
string issuer = mIConfiguration["issuer"];
string audience = mIConfiguration["audience"];
string tokenTime = "";
JObject obj = new JObject();
obj.Add("token", "Bearer " + AuthBiz.getTokenCustromTime(SecurityKey, issuer, audience, name: username, tokenTime: out tokenTime, dateTime: DateTime.Now.AddDays(3)));
obj.Add("tokenTime", tokenTime);
obj.Add("code", 0);
return obj.ToString();
}
app客户端的处理
全局拦截请求,首先调用isNeedRefreshToken
判断是否需要刷新,如果需要,刷新之后再请求需要请求的连接.
public static boolean isNeedRefreshToken() {
if (!SuperContext.getInstance().isLogin()) {//如果没登录 直接登录好了,token都没得刷个锤子.
return false;
} else {
long expirationTime = SuperContext.getInstance().getSessionInfo().getExpirationTime();
if(expirationTime==0){
return false;//代表可能是未登录的时候发起的请求,登录后 时间不会大于0
}else{
long expirationTimeMinute= (long) (expirationTime/60f/60f);
long currentSecondMinute = (long) (System.currentTimeMillis()/60f/60f);
long distance=expirationTimeMinute-currentSecondMinute;
if(distance>0&&distance<120){//如果快过期但是还没过期 也就是再快过期的2小时内刷新都能进行延长token有效期.
return true;
}else{
return false;
}
}
}
}
protected Response getResponse(OkHttpClient.Builder builder) throws IOException {
if (BaseUtil.isNeedRefreshToken()) {//进行token刷新操作
try {
String url = String.format(Cns.REFRESH_TOKEN_URL, GlobalSettingModel.getInstance().getUrl_webapi(), AppUtils.encodeUrlParam(SuperContext.getUserName()), SuperContext.getInstance().getBuildTime());
Response response = HttpUtil.querySyncGetDataCancelable(url, builder.build(), getHeader(), null);
if (response.isSuccessful()) {
String string = response.body().string();
org.json.JSONObject jsonObject = new org.json.JSONObject(string);
String token = jsonObject.optString("token", SuperContext.getInstance().getSessionInfo().getToken());
long expirationTime = jsonObject.optLong("expirationTime", SuperContext.getInstance().getSessionInfo().getExpirationTime());
SuperContext.getInstance().getSessionInfo().setAccessToken(token);
SuperContext.getInstance().getSessionInfo().setExpirationTime(expirationTime);
} else {//忽略
}
} catch (Throwable e) {
//忽略
}
}
return HttpUtil.querySyncGetDataCancelable(getUrl(), builder.build(), getHeader(), requestPair);
// return HttpUtil.querySyncPostDataCancelable(getUrl(), builder.build(), getHeader(), requestPair);
}
网上也有其他办法,说什么用双token,在客户端已经进行403的时候使用返回的刷新token再进行一些刷新token操作,这种方法属于明知道失效了但是先失效然后再进行访问。。我还是喜欢我这种方式。。
网友评论