【WebAPI】身份校验安全问题

不胖到130不改名字 2019-07-01 11:45:57
设计开发WebAPI
现在想的是
第一次登录,前台发送 用户+密码=》后台生成token返回
前台每次操作都要携带登录时生成的token
token没有储存在后台,只是后台每次会解析接收到的token判断有效时间是否过期。

现在想的问题是如果token被其他人拿到了不也能请求所有的接口了?

WebAPI有关安全性的问题应该怎么设计比较好呢?

...全文
272 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
by_封爱 2019-07-01
  • 打赏
  • 举报
回复
我们用微信api假设一下. 你在获取token的时候 传的是公众号的2个唯一标识... 你可以把这当成用户密码.. 比如用户登陆成功了 然后你生成一个 GUID(token)给前台返回 然后把这个token当key userid当value 存到redis 里面 2小时失效.. 然后在以后的请求中 ,通过key来取userid 继续后面的操作.
  • 打赏
  • 举报
回复
引用 1 楼 正怒月神 的回复:
所以token有过期时间。每隔一段时间,就需要请求一个新的token 其实真被人拿到,也没办法。 这就像人家拿到你密码登录了。你说怎么验证这个人是不是本人?
有道理, 那这个每隔一段时间请求新的token,怎么设计好呢? 用户名+密码请求新token?还是拿着旧token去请求新的token? 请求的时间节点(每次用户操作就生成新token返回)?
正怒月神 2019-07-01
  • 打赏
  • 举报
回复
所以token有过期时间。每隔一段时间,就需要请求一个新的token 其实真被人拿到,也没办法。 这就像人家拿到你密码登录了。你说怎么验证这个人是不是本人?
by_封爱 2019-07-01
  • 打赏
  • 举报
回复
伪代码吧..

var token=request.headers["token"];
var uid=redishelper.get<string>(token);
if(uid==null)
{
  throw new xxxxException("当前token已经过期");
}
因为你存起来的时候 就已经设置了过期时间.. 2H内有效 因为过期了,. 所以客户端肯定会收到这个东西...微信也一样. 至于如何持久化token 那是客户端的问题.. 你只关心这个key-value 2小时有效就行了...最简单的办法就是redis 设置这个时间.. 过期了 客户端就自己重新使用用户名+密码 去重新调用你的gettoken接口了.. 而你的gettoken接口 差不多就如下.伪代码.

var uid=requst["username"];
var pwd=requst["password"];
var logincheck=select count(1) from userinfo where .....
if(logincheck==1)
{
 //登陆成功
 var token=guid..newid();
 redishelper.add<string>(token,uid,new timespan(0.2,0);
 return token
}
else
{
 throw new xxxxException("登陆失败");
}
当然我这个只是仅仅保存了用户名,,因为大部分业务都是基于用户名来操作的.. 你也可以把user对象扔到redis的value里面 .根据实际需求来.需要什么 就保存什么.
正怒月神 2019-07-01
  • 打赏
  • 举报
回复
引用 2 楼 懒懒懒源 的回复:
[quote=引用 1 楼 正怒月神 的回复:] 所以token有过期时间。每隔一段时间,就需要请求一个新的token 其实真被人拿到,也没办法。 这就像人家拿到你密码登录了。你说怎么验证这个人是不是本人?
有道理, 那这个每隔一段时间请求新的token,怎么设计好呢? 用户名+密码请求新token?还是拿着旧token去请求新的token? 请求的时间节点(每次用户操作就生成新token返回)?[/quote] 重新请求一个token。 过期的token一般就不存在了。所以没办法用旧的token换新的。 不然过期token就太多了。
  • 打赏
  • 举报
回复
引用 3 楼 by_封爱 的回复:
我们用微信api假设一下. 你在获取token的时候 传的是公众号的2个唯一标识... 你可以把这当成用户密码.. 比如用户登陆成功了 然后你生成一个 GUID(token)给前台返回 然后把这个token当key userid当value 存到redis 里面 2小时失效.. 然后在以后的请求中 ,通过key来取userid 继续后面的操作.
微信api是怎么处理token到期的 是用户发现到期了,再通过用户密码重新请求新的token吗
  • 打赏
  • 举报
回复
你这不就是jwt机制么 如果要后端有控制判断,那么服务端存储是必须要有的,但如果服务端存储了,那传统的Session方式完全满足需求

13,190

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 分析与设计
社区管理员
  • 分析与设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧