发布时间:2023-05-12 18:22:53
App 调用登录接口返回用户的token信息,token信息存储在本地,以后每个接口都发送token,如果服务器验证token失效,一般客户端都会怎么处理?跳入登录页面让用户登录?还有没有其他的处理方式?可不可以手动刷新token再重新请求?这枯祥携样是不是token失效就变得没有意义了?如果token泄没伏露了会造成哪些后果?
我现在碰见的问题是需要手动更新token,但是由于我的请求类是一个公用类,如果在请求中判断token失效就需要刷新token,这样第一个的请求数据就没了,如果建立一个公用类存储,但发生多个异步请求的时候,只有一个请求的数据可以保留下来,有没宴斗有什么比较好的解决方案?
连接各行各业的平台载体。
token钱包已经远远超过了一般数字货币链察没钱包功能。
它不仅仅是一款存储数字货币的普通钱包,而是没唯真正的去中心化的棚纳区块链链上钱包;
它的功能也不仅仅只存储数字货币。
安全
在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等,但是为了安全起见让用户暴露的明文密码次数越少越好,我们一般在web项目中,大多数采用保存的session中,然后在存一份到cookie中,来保持用户的回话有效性。但是在app提供的开放接口中,后端服务器在用户登录后如何去验证和维护用亏燃户的登陆有效性呢,以下是参考项目中设计的解决方案,其原理和大多数开放接口安全验证一样,如淘宝的开放接口token验证,微信开发平台token验证都是同理。
签名设计
对于敏感唤空伏的api接口,需使用https协议
https是在http超文本传输协议加入SSL层,它在网络间通信是加密的,所以需要加密证书。
https协议需要ca证书,一般需要交费。
原理:用户登录后向服务器提供用户认证信息(如账户和密码),服务器认证完后给客户端返回一个Token令牌,用户再次获取信息时,带上此令牌,如果令牌正取,则返回数据。对于获取Token信息后,访问用户相关接口,客户端请求的url需要带上如下参数:
时间戳:timestamp
Token令牌:token
然后将所有用户请求的参数按照字母排序(包括timestamp,token),然后根据MD5加密(可以加点盐),全部大写,生成sign签名,这就是所说的url签名算法。然后登陆后每次调用用户信息时,带上sign,timestamp,token参数。
api请求客户端想服务器端一次发送用用户认证信息(用户名和密码),服务器端请求到改请求后,验证用户信息是否正确。
如果正确:则返回一个唯一不重复的字符串(一般为UUID),然后在Redis(任意缓存服务器)中维护Token—-Uid的用户信息关系,以便其他api对token的校验。如果错误:则返回错误码。
2.服务器设计一个url请求拦截规则
(1)判断是否包含timestamp,token,sign参数,如果不含有返回错误码。
(2)判断服务器接到请求的时间和参数中的时间戳是否相差很长一段时间(时间自定义如半个小时),如果超过和携则说明该url已经过期(如果url被盗,他改变了时间戳,但是会导致sign签名不相等)。
(3)判断token是否有效,根据请求过来的token,查询redis缓存中的uid,如果获取不到这说明该token已过期。
(4)根据用户请求的url参数,服务器端按照同样的规则生成sign签名,对比签名看是否相等,相等则放行。(自然url签名也无法100%保证其安全,也可以通过公钥AES对数据和url加密,但这样如果无法确保公钥丢失,所以签名只是很大程度上保证安全)。
(5)此url拦截只需对获取身份认证的url放行(如登陆url),剩余所有的url都需拦截。
3.Token和Uid关系维护
对于用户登录我们需要创建token–uid的关系,用户退出时需要需删除token–uid的关系
你对 TOKEN 和 SESSION 的理解有误。
SESSION 是服务器通过 Key-Value 对来保存数据的一种机制,比如 APP 的登录状态清睁可以用 SESSION 来保存。
TOKEN 翻译过来叫令牌,令牌是什么意思?可以拿现实中的令牌对比,现实中的令牌起到通行证的作用,而这在服务端也是一样的。我们在登录后,服务端使用 SESSION 保存我们的登录状态,并把 SESSION 的 Key 返回给客户端,那么这个 Key 就成为我们的令森蚂牌(TOKEN),我们以后再访问数据,就此正埋直接把这个 TOKEN 随着请求一起发送给服务端,这样服务端通过这个 TOKEN 在 SESSION 中查找数据,如果有就说明 TOKEN 有效(就像你去旅游,关口认可你的通行证),并取出你的登录数据,利用你的用户信息(保存在登录数据内)查出你想要的内容。
实际上 TOKEN 的校验会更复杂,上面只是给出一个简单的例子方便理解。
session在会话机制,app进程被结束掉或者长时间不使用是不能继续的会话的交换数据的;
而token是旅雀碧由账号密码换取而来的,存在app本地,keychain等位置。就算会话拆举岁衡结束,下次启动app也照样不用登录账号密码