15.app后端怎么设计用户登陆方案

【转载】做者:曾健生,公众号IDappbackendweb

               比目科技 Bmob后端云redis

 

在不少app中,都须要用户的登陆操做。登陆,就须要用到用户名和密码。为了安全起见,暴露明文密码的次数越少越好。怎么能最大程度避免泄露用户的密码呢?在登陆后,app后端怎么去验证和维持用户的登陆状态呢?在本文中,给出了一套用户登陆的解决方案,以供你们参考。后端

 

1.保证登陆的安全性,最起码要使用https协议api

 

  避免信息的泄露,最简单的方案是全部涉及到安全性的api请求,都必需要使用https协议。浏览器

 

  HTTPSSecure Hypertext Transfer Protocol)安全超文本传输协议安全

 

  它是一个安全通讯通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来讲它是HTTP的安全版。它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操做,并返回网络上传送回的结果。HTTPS实际上应用了Netscape的安 全全套接字层(SSL)做为HTTP应用层的子层。服务器

 

  http是超文本传输协议,信息是明文传输,https 则是具备安全性的ssl加密传输协议。cookie

 

  注意了,https协议须要到ca申请证书,通常免费证书不多,须要交费。网络

 

  咱们能够看看全部大型网站,例如京东,淘宝,支付宝,涉及到登陆和支付的页面,url都是以https开头,这就意味着,此次通信是使用https。开放平台的api,例如新浪微博,腾讯等,api请求都是以https开头的。https是业界经常使用的保证安全性的协议。session

 

  所以,涉及安全问题的api,都应该使用https协议。虽然,https为了保证安全性,在效率上是比http协议低。

 

2.基本的用户登陆方案

 

  在传统的web网站中,能够使用cookie+session来实现用户的登陆维护,那么在app后端,能够怎么实现呢?

 

  在app后端,怎么避免每次验证用户身份都须要传输用户名和密码呢?

 

  一个生活的模型就是:

 

  假设服务器是个房间,里面有个房间管理员,房间上的门有把锁,这把锁有两种打开方式:

 

  1. 输入了这把锁上注册的用户名和密码,就能打开

 

  2. 用房间管理员提供的钥匙打开

 

  a.当第一次使用用户名和密码打开了这把锁后,进入房间,找到房间管理员,让他提供一把钥匙。

 

  b.那之后每次须要进入这个房间,就用这把钥匙就好了,不用担忧旁边有人偷看到本身的用户名和密码.

 

  c.决定有一段时间不进入这个房间,又怕钥匙被偷,就进入房间里,把钥匙还给管理员,让管理员把钥匙毁灭

 

  a就是登陆的操做,b就是验证身份的操做,c就是退出登陆的操做.

 

  理论版的描述以下:

 

  (1)  服务器接收到app发送的用户名和密码后,验证用户名和密码是否正确。

 

  若是错误则返回错误信息。

 

  若是验证正确,生成一个随机的不重复的token字符串(例如"daf32da456hfdh"),在redismemcache中维护一个映视表,创建token字符串和用户信息的对应关系表,例如,把token字符串"daf32da456hfdh"和用户id"5"对应起来。

 

  (2) 服务器把token字符串返回给appapp把这个token字符串保存起来,做为登陆的验证。

 

  (3) 当须要验证用户身份的操做时,必需要把token字符串传给服务器验证身份。

 

  例如,api "test.com/user/update"是更新用户的信息,必需要验证用户的身份.当调用api "test.com/user/update"时,把token字符串"daf32da456hfdh"放在url上,变成"test.com/user/update?token=daf32da456hfdh" .

 

  当服务器接收到这个api请求,知道要验证用户身份的,因而,就把参数中token的值"daf32da456hfdh"取出来,在(1)中创建的token字符串和用户信息的对应关系表查找,若是发现没这个token值的,则返回验证失败的信息。若是发现有这个token值,则获取这个用户的信息,进行相关的更新操做。

 

  (4) 当用户退出登陆时,须要经过调用api,让服务器把这个用户对于的token字符串删除.

 

  例如,api "test.com/user/logout"是退出登陆的api,也要验证用户身份, 则调用"test.com/user/logout?token=daf32da456hfdh" 。当服务器接到退出登陆的api请求时,在(1)中创建的token字符串和用户信息的对应关系表查找token字符串,把token和用户信息都删除便可。

 

  注意:这个方案并非十分安全,这个身份验证是依赖于token字符串。若是用户泄漏了本身的url, 那很大程度上token也被别人泄漏了,就至关于钥匙被人复制了一份。在下篇的通信安全中,会描述一个防止token在通信中泄漏的方案。

相关文章
相关标签/搜索