api接口token验证,
在app开放接口api的设计中,不可避免的问题就是安全性。因为大部分界面都涉及到用户的个人信息和一些敏感数据,这些界面都需要认证,所以用户需要提供一些信息,比如用户名和密码。然而,出于安全考虑,用户暴露其明文密码的次数越少越好。通常,我们在web项目中使用保存的会话,然后将一个副本保存到cookie中,以保持用户的回复有效。但是,在app提供的开放接口中,用户登录后,后端服务器如何验证和维护用户的登录合法性?参考项目中设计了以下解决方案,其原理与大部分开放接口安全验证相同,如淘宝的开放接口令牌验证、微信开发平台令牌验证等。
签名设计
对于敏感的api接口,需要https协议。
Https在http超文本传输协议中增加了SSL层,其网络间的通信是加密的,因此需要加密证书。
Https协议需要ca证书,一般需要付费。
签名设计
原理:用户登录后向服务器提供用户认证信息(如账号、密码),服务器认证后向客户端返回一个Token令牌。当用户再次获取信息时,他们会带着这个令牌,如果令牌被带走,他们将返回数据。为了在获取令牌信息后访问用户相关界面,客户端请求的url需要带以下参数:
时间戳:时间戳
令牌:令牌
然后将用户请求的所有参数按字母顺序排序(包括时间戳和令牌),再用MD5加密(可以加点盐),全部大写生成sign签名,称为url签名算法。然后每次登录后调用用户信息,带上sign,timestamp,token这些参数。
例如,https://www.andy.cn/api/user/update/info.shtml?最初被要求。城市=北京(post和get是一样的,所有参数都是排序加密的)
添加时间戳和令牌。
https://www.andy.cn/api/user/update/info.shtml?City=北京timestamp=12445323134 token=wekfjdskfjewfjkjfdfnc
然后生成带有更多url参数的符号。
最后的请求如
https://www.andy.cn/api/user/update/info.shtml?City=北京timestamp=12445323134 token=wekfjdskfjewfjkjfdfncsign=fdk 2434 jkjfd 334 fdf 2
最终的原则是减少明文的暴露次数;确保安全访问数据。
具体实现如下:
1.api请求客户端一次性向服务器发送用户认证信息(用户名和密码),服务器收到变更请求后验证用户信息是否正确。
如果正确的话,会返回一个唯一的不重复的字符串(通常是UUID),然后在Redis(任意缓存服务器)中维护Token - Uid的用户信息关系,以便其他API检查该Token。
如果错误:则返回错误代码。
2.服务器设计url请求拦截规则
(1)确定是否包含时间戳、令牌和签名参数,如果不包含返回错误代码。
(2)确定服务器收到请求的时间与参数中的时间戳是否有较长的时间差(时间定义为半小时)。如果是,说明网址已经过期(如果网址被盗,他改了时间戳,但是会导致sign签名不对等)。
(3)判断令牌是否有效,根据请求的令牌查询redis缓存中的uid。如果拿不到,说明令牌已经过期。
(4)服务器根据用户请求的url参数,按照相同的规则生成sign签名,比较签名是否相等,然后释放。(自然的网址签名也不能100%保证其安全性。也可以通过公钥AES加密数据和url,但如果公钥不能丢失,签名只是在很大程度上保证了安全性)。
(5)这个网址拦截只需要释放已经认证的网址(比如登录网址),其余网址都需要拦截。
3.维护3。令牌和Uid关系
我们需要在用户登录时创建令牌-uid关系,并在用户注销时删除令牌-uid关系。