• **15.app后端怎么设计用户登录方案(API权限安全)


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


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



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


      HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议


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


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


      注意了,https协议需要到ca申请证书,一般免费证书很少,需要交费。


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


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


    2. 基本的用户登录方案



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


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


      一个生活的模型就是:


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


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


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


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


      b.那以后每次需要进入这个房间,就用这把钥匙就行了,不用担心旁边有人偷看到自己的用户名和密码.


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


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


      理论版的描述如下:


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


      如果错误则返回错误信息。


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


      (2) 服务器把token字符串返回给app,app把这个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在通讯中泄漏的方案。

    注:当TOKEN过期了怎么办?

    一般TOKEN需要保存几个月,当过期了之后,让用户重新登录,输入密码,重新获取TOKEN

    http://blog.csdn.net/newjueqi/article/details/44062849

  • 相关阅读:
    org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].Standard
    mybatis plus 代码生成器
    ServerU FTP服务器无法上传中文名文件怎么办
    关于java文件下载文件名乱码问题解决方案
    使用Redis模拟简单分布式锁,解决单点故障的问题
    springboot定时任务处理
    AtomicInteger类的理解与使用
    java队列——queue详细分析
    ABAP DEMO so批量导入
    ABAP DEMO ole示例程序
  • 原文地址:https://www.cnblogs.com/kenshinobiy/p/4344748.html
Copyright © 2020-2023  润新知