我们在使用App时,一次登录后App如果不主动退出登录或者清除数据,App会在很长一段时间内保持登录状态,或者让用户感觉到登录一次就不用每次都输入用户密码才能进行登录。银行、金融涉及到支付类的App一般不支持这种长时间的登录状态保持。对于保持长期登录的技术实现方式,除了和前端技术有关,还涉及到前后台的通讯连接方式、后台提供的服务方式等有关。比如前端App是前端技术是原生加H5实现的,那选择的技术可能和纯原生的不一样。还有如果后端使用了sso(单点登录方式)技术那就和后端使用了webservice、Socket的方式不一样,具体实现上有时候需要综合考虑。总结出来一般的登录保持功能有如下的实现方式:
一、利用Cookie机制实现
我们知道cookie是为了解决http无状态的一种技术,被电商、oa等web应用广泛使用。如果我们的App和后端通讯采用的http通讯方式,可以利用cookie技术进行登录状态保持。比如我们可以把sessionID和有效期保存在cookie中,发给前端App,前端App收到后保存在本地。当访问后端服务把sessionID和有效期作为参数传给后台进行认证。直到sessionID失效,用户都不需要重新登录。
二、用户名和密码
如果App和后端通信不是通过http协议进行的,那cookie机制可能就不太适合。利用用户名和密码保持登录是指用户在第一次登录成功时,把用户名和密码保存的本地,下次用户打开App时登录利用保存的用户名和密码在后台自动完成。这种方式需要考虑用户名和密码的安全问题,防止信息被破解。
三、token方式
token方式在app认证上用的比较普遍,App初始登录时,提交账号和密码数据给服务端,服务端根据定义的的策略生成一个token字符串,token字符串中可以包含用户信息、设备ID等信息以保证用户的唯一性。服务端并对token设置一定的期限。服务端把生成的token字符串传给客户端,客户端保存token字符串,并在接下来的请求中带上这个字符串。相对于在App本地token的安全性更高了。
App登录状态保持除了实现路径外还需要考虑服务端数据持久化问题、客户端防拷贝问题、拦截破解问题等,在使用中需要综合考虑。
token (需要django的rest_framework.authtoken模块)
客户端通过post请求发送username和password到服务器端,服务器端验证用户名和密码正确后返回一个token
客户端接受返回的token并保存
客户端发起请求时需要在请求的header中的authentication属性添加token值
django使用request.user.is_authenticated()判断用户是否登录,若token正确则会自动登陆
session(为每个浏览器创建一个session对象,每个session对象有一个Jsessionid,以cookie的方式将Jsessionid返回给浏览器):
前端页面发送username和password到服务器的login接口时,针对每个用户的浏览器生成一个session对象,每个session对象有一个Jsessionid,login判断用户名和密码正确后,,通过request.session[‘username’]=username,request.session[‘isLogin’]=true往该用户浏览器的session中添加多个key/value值,数据库django-session表中为每个session对象生成一条记录[sessionid,key,value:“hduhueu”,“username”:“pengcong1995”;“isLogin”:“true”],并且将Jsessionid置于cookie中返回给前端(默认自动进行)
前端接收返回的结果自动保存Jsessionid在cookie中
前端浏览器发起请求时,请求里自动带上了cookie的数据包括Jsessionid
服务器端接收请求,通过Jsessionid找到对应的session对象,通过不同的session对象为不同的用户服务,使用username=request.session.get(‘username’)判断用户是否登录,若username存在,则为已登录过的用户,用户名已知,不存在则为未登录用户(使用request.session.get(‘username’)时,服务器自动读取cookie中的sessionid,找到对应的session,若不存在sessionid,则未登录没有session对象,再根据session对象找到对于的key即username,再获取该值,如果存在则已登陆过,否则未登陆)
退出登陆时,根据cookie中的sessionid找到对应的session对象,删除当前用户的session中的数据即可,del request.session[‘username’],全部删除,request.session.clear()
网友评论