0371-66086066

您当前位置> 首页 >> 方案

注册和登录功能常见的产品方案及技术原理

1.如何记住密码

账号和密码可以记录在本地。打开产品时,便将预先保存在本地的账号和密码取出,与服务器进行校验。这里的“本地”,对于Web产品来说就是在浏览器中,对于App来说则是在手机中。

常见的技术解决方案有哪些呢?

首先,是基于Cookie的方案。

Cookie是客户端向服务器发起请求后,服务器返回给客户端的信息之一,客户端会将Cookie保存下来并在后续接口中带上该信息,使服务器可以判断是哪个客户端发起的请求。

在动登录场景下,用户首次登录后,账号和密码会被记录在Cookie中,后续登录时,客户端便从本地取出Cookie中的账号和密码发送给服务器验证,通过后登录成功,省去了用户手动重复输入账号和密码的过程。

Web类型的产品中,则是利用localStorage来实现记住密码功能的。localStorageHTML5标准中新加入的一种技术,该技术用于解决Cookie存储空间比较小的问题。与每条Cookie4Kb的容量大小相比,localStorage的容量大小一般会达到5Mb,具体容量大小在不同的浏览器中会存在差异。并且,保存在localStorage中的数据是永不过期的,除非进行了主动清空操作。

但把账号和密码信息保存在本地,存在账号密码被泄露及伪造的风险。所以,基于Token的方案便应运而生。大致过程与基于Cookie的方案类似,只是Token中无须保存账号和密码信息,从而提高了安全性。

2.如何设置账号密码

首先,依然是借助Cookie方案。在客户端向服务器发起请求之后,服务器给客户端返回Cookie时,直接设置好过期时间,一旦过期,客户端的Cookie信息就会被清除,后续登录则需要重新验证。

另外,就是借助Token方案。Token类似于Cookie,也可以设置过期时间。设定过程如下:首次登录时,客户端将账号和密码发送给服务器,服务器创建refresh tokentoken两个参数,将它们绑定,并设置不同的过期时间(一般可将token参数的过期时间设定得更早),后续登录只需带着Token即可校验。Token过期了以后,客户端就会向服务器重新申请Token,此时会先比对之前的refresh token,匹配后便生成新的token替换掉之前refresh token绑定的token,并将新的token返回给客户端,后续客户端发送请求时,带上新的token即可,于是用户的登录状态便是一直可用的,直到tokenrefresh token参数都过期后,用户才需要重新输入账号和密码。

公司的产品数量不多时,用户注册账号登录,并结合记住密码功能,便可满足用户短期内均无须再次输入账号和密码的需求。

3.单点登录

一般公司的不同产品均位于同一个根域名下,但也不排除有些公司一条业务线或一个产品就占用一个单独的域名。举例说明,如果公司服务器域名为example.com,且存在两个系统对应的子域名为big.example.comhuge.example.com,在提供了登录功能的情况下,用户如果要打开这两个域名对应的系统页面,是需要分别登录的。那么怎样才能让用户在登录了其中一个系统后,打开另一个域名对应的系统时无须重复登录呢?

借助前面讲解过的Cookie知识,如果用户登录其中一个系统,在客户端本地记录下用户登录的Cookie信息,下次用户依然在同一端打开另一个系统登录,是不是可以将之前用户本地保存的Cookie信息拿过来直接用呢?遗憾的是,Cookie的使用不支持跨域,即不能直接拿Cookie中关于big.example.com域名的账号信息直接登录huge.example.com。那么,如何解决这个问题呢?好在设置Cookie时,除了可以设置当前域的信息,还可以设置对应的顶级域名,即example.com,在子域中又可以访问顶级域中的Cookie信息。

用户在某个子域名登录后,服务器可在数据库中保存Session信息,其中就记录了登录状态。只要登录状态尚未结束,便可根据Cookie找到Session,保持之前的登录状态。具体如何根据Cookie找到Session呢?例如,用户在子域名big.example.com登录后,保存的是cookie1并生成对应的session1,然后在子域名huge.example.com登录,保存的是cookie2并生成对应的session2,两个独立的Session是无法知道彼此的登录状态的。为了解决这个问题,就需要借助Session共享技术。简单来讲,就是可将第一个子域名对应的系统与服务器会话时生成的Session共享给同一个根域名下的其他子域名使用,这样就可以解决有登录的Cookie信息,但没法确定登录状态,从而实现用户的免密登录。

相关方案查看更多