文档章节

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

 晓已
发布于 2015/05/15 17:37
字数 1445
阅读 32
收藏 2

【转载】作者:曾健生,公众号IDappbackend

               比目科技 Bmob后端云

 

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

 

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

 

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

 

  HTTPSSecure 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"),在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在通讯中泄漏的方案。

本文转载自:http://mp.weixin.qq.com/s?__biz=MzA3NDMzODk5Mw==&mid=203394965&idx=1&sn=9a9d169e0141602c54b4bae9a...

粉丝 2
博文 15
码字总数 1110
作品 0
广州
私信 提问
加载中

评论(1)

T小工
T小工
我觉得可以把如果用户密码在PC端发生变化了,服务端token表里面的加密串也要发生变化;还有需要设置token的时效性,很多情况情况下,APP是不会调用登录退出的
app后端设计--总目录

做了3年app相关的系统架构,api设计,先后在3个创业公司中工作,经历过手机网页端,android客户端,iphone客户端,现就职于app云后端平台bmob(想了解bmob点击这里)。其中的乐与苦,得与失,...

云栖希望。
2017/12/04
0
0
两个服务部署在不同服务器,两个服务怎么判断是同一个用户?

两个服务部署在不同服务器,A服务做了登录,同一个域名下,B服务怎么知道是在A服务登录的用户? 方案一:在A服务登录时,把用户id放在session的attribute里,然后B服务取这个session的用户i...

尤文图斯
05/29
586
15
微信小程序开发之从“跳伞”到“吃鸡”

写在前边 微信小程序随着官方开放越多越多的接口,也是变的越来越火了,越来越多的企业已经开始布局小程序生态。所以,对于我们开发者来说,掌握小程序开发显得分外重要。如果点亮了该技能,...

imwty
2018/07/25
0
0
Spring Boot + Vue前后端分离开发实战

前后端分离是一种开发方式,已经变得越来越流行了,越来越多的企业都开始往这个方向靠拢。那么,为什么要选择前后端分离呢?前后端分离对实际开发有什么好处呢? 前后端分离可以让专人做专事,...

尹吉欢
2018/06/10
0
0
基于Vue+VueRouter+Vuex+Axios的用户登录态路由级和接口级拦截的原理与实现

前言 前后端分离开发、独立部署,为前端的开发人员提供了极大的便利,同时也带来了新的挑战。 前后端分离带来的问题 在路由级,模块之间的切换、跳转需要前端进行独立的维护 在接口级,前后端...

JustBeCoder
06/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
今天
6
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
今天
7
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
今天
5
0
OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
1K
11
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
40
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部