在很多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

**15.app后端怎么设计用户登录方案(API权限安全)的更多相关文章

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

    在很多app中,都需要用户的登录操作.登录,就需要用到用户名和密码.为了安全起见,暴露明文密码的次数越少越好.怎么能最大程度避免泄露用户的密码呢?在登录后,app后端怎么去验证和维持用户的登录状态呢? ...

  2. day102:MoFang:后端完成对短信验证码的校验&基于celery完成异步短信发送&flask_jwt_extended&用户登录的API接口

    目录 1.用户注册 1.后端完成对短信验证码的校验 2.基于celery实现短信异步发送 2.用户登录 1.jwt登录验证:flask_jwt_extended 2.服务端提供用户登录的API接口 1 ...

  3. 【Qt编程】基于Qt的词典开发系列<八>--用户登录及API调用的实现

    在上一篇文章<调用网络API>中,我仅仅讲述了怎样直观的使用API接口以及调用API后返回的结果,本文则从程序实现的角度来实现API的调用.当然本程序的实现也是借助于扇贝网的API接口文档 ...

  4. samba共享目录无法访问的一般解决方案,非用户登录和读写权限问题

    配smb,被第四点坑了很久,特此转载. 由于这5点都是比较普通的情况,不涉及用户登录和读写权限问题 1)关闭防火墙: #sevice iptables stop 2)修改 /etc/samba/smb ...

  5. 14.app后端如何设计api

    app和后端的交互,一般都是通过后端提供的api实现.api的设计,估计很多刚进入app后端的小伙伴会一无头绪,不知道怎么入门.下面根据自己3年的app后端经验,总结出下几个api设计原则,给小伙伴参 ...

  6. 分享:个人APP(非企业资质)的微信登录方案

    目前微信开放平台个人主体类APP不支持开通微信登录,那么个人开发者如何解决微信登录的问题呢?目前有一种替代方案是用微信小程序作为媒介来达到微信登录的目的. 微信小程序的登录无需企业资质,同时登录后返回 ...

  7. ubuntu使用root用户登录/切换root权限

    ubuntu系统默认root用户是不能登录的,密码也是空的. 如果要使用root用户登录,必须先为root用户设置密码 打开终端,输入:sudo passwd root 然后按回车 此时会提示你输入密 ...

  8. sonar + jacoco + mockMvc 模拟session 用户登录 配合SpringSecurity 权限 快速测试代码覆盖率.

    遇到mock 测试简直就是神器,特别是要做代码覆盖率,直接测试controller就好了,缺点,虽然可以回滚事务,但是依赖数据库数据,解决,根据SpringBoot ,再建立一个专门跑单元测试的数据库 ...

  9. tp5的RBAC插件及其使用很方便的管理用户登录及操作权限

    tp5-rbac 本扩展包是tp5的rbac包,使用了部分tp5的特性实现了关系型数据库中特殊数据结构的处理. 安装方法 先安装composer如果不知道怎么安装使用composer请自行百度. 打开 ...

随机推荐

  1. 一本通1642【例 2】Fibonacci 第 n 项

    1642: [例 2]Fibonacci 第 n 项 sol:挺模板的吧,经典题吧qaq (1) 1 0    *     1 1     =   1 1 1 0 (2) 1 1    *     1 ...

  2. POJ 2584 T-Shirt Gumbo

    T-Shirt Gumbo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3689   Accepted: 1755 Des ...

  3. c++11 强类型枚举

    c++11 强类型枚举 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #inclu ...

  4. 【转】如何解决使用keil下载或者调试程序是提示的“Invalid ROM Table”信息!

    在将Discovery的工程移植到Mini-STM32F4x9BI开发板时,使用ULINK2下载程序可能会出现如下图所示的“Invalid ROM Table”这个错误. 可能原因是使用Mini-ST ...

  5. POJ 3259 Wormholes(最短路径,求负环)

    POJ 3259 Wormholes(最短路径,求负环) Description While exploring his many farms, Farmer John has discovered ...

  6. 【codevs1297】硬币 完全背包

    题目大意:给定 N 种不同种类的硬币,每种硬币的重量范围在一个可变区间内,但是价值恒定,求给定一个重量 W,求有多少种面值不同的组合方式. 题解:如果硬币的重量恒定,那么就是一道裸的完全背包问题.因此 ...

  7. UDP ------ UDP 和 TCP 的对比

    UDP是无连接协议,客户端和服务器通信之前不需要建立握手连接: UDP没有应答机制,所以也没有重发机制,很大的可能会造成丢包.收到重复包.乱序的情况: UDP可以实现局域网广播功能,即某个主机可以向所 ...

  8. CentOS 7.4 java验证码乱码的问题

     转载阿里云 摘要: 新服务器配置发布网站 配置后程序顺利启动在登录时发现验证码无法识别显示出了图片,但是字是乱码 初步估计应该是字体问题 ssh登录服务器查看默认字体 #fc-match msam1 ...

  9. Access与SQL Server 语法差异

    序号 简述 Access语法 SqlServer语法 Oracle语法 解决方案 01 系统时间 Now(),Date() GETDATE() SYSDATE GetSysTimeStr 02 连接字 ...

  10. bzoj千题计划223:bzoj2816: [ZJOI2012]网络

    http://www.lydsy.com/JudgeOnline/problem.php?id=2816 每种颜色搞一个LCT 判断u v之间有边直接相连: 如果u和v之间有边相连,那么他们的深度相差 ...