rest 接口如何保证 客户端请求的用户唯一性
我们接口开发遇到一个问题,是这样的。例如我们使用 oauth 2.0 的密码协议认证。用户登录后认证系统给一个有时效性的 token,然后客户端每次请求的时候带上这个 toekn 访问 restful 资源。但是遇到一个蛋疼的问题就是怎么保证用户请求的资源是合理的。
场景:
用户a要删除他的车辆信息。那么client 提交过来 用户主键和车辆主键,先判断当前车辆是否属于当前用户,则数据可以进行删除动作。 这时候如果他人拦截模拟登录,然后传递一个非当前用户的主键(胡乱编造的主键)然后主动探测的模式去匹配对应的主键,去恶意删除他人的用户信息。这样就会出现非常大的危害。例如:所有主键都是通过自增的方式生成的,这样恶意删除的几率就会大得多。
怎么样才能避免这种情况出现呢?之前也没设计过关于 restful 相关的内容,也没有这方面的经验。
有种本方法可以实现,就是 把 token 和 用户信息在后端绑定(有点像 session的形式),但是感觉这种又违背了restful 的原则。有没有好的解决方案,或者我理解上的问题?
Answers
看你的问题,实际上是防止重复请求攻击(RepeatAttack)和内容被篡改。
参考下面链接S3的做法,发token的同时给每个token准备一个私钥也发给用户,client端的程序用私钥和URI和时间戳生成签名,每次请求除了表明身份的token之外还要有签名sign。你通过token拿到私钥,验证签名就行了。这样就防止了内容被篡改。
另一类的如果这个资源读取都很关键,别人只要拿到读取都很需要。那么就需要像S3那样再建立一个超时拒绝和超时时间段内重复请求拒绝。这样
参考: http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-r...
看看 JSON Web Token ,这里的token中是带有用户信息的,每次收到请求解码token得到用户ID,这样也就防止了client端的恶意篡改。
Authentication is the process of ascertaining that somebody really is who he claims to be.
Authorization refers to rules that determine who is allowed to do what.
http://stackoverflow.com/questions/6556522/authentication-versus-autho...
显然你只考虑了Authentication.
http://devcenter.kinvey.com/rest/guides/security
最简单的实现Authorization的方法是在表中加ACL字段定义来实现行级access control
对于防止拦截模拟登陆,https是肯定的。问题是你的设计可以不用拦截,只要注册一个合法用户就可以在有缺陷的鉴权下跨权限访问资源了