登录实现流程

一、几种登录方式

1、cookie+session

2、token

3、sso 单点登录

4、OAuth 第三方登录

二、各种登录方式的实现流程

1、cookie+session

实现流程:

缺点:

a、由于服务器要对接大量的客户端,所以服务器要存储大量的session,这会给服务器造成很大的压力

b、如果服务以集群的方式部署,为了同步登入态,那么还得同步session到每一台服务器上

c、由于seesionId是存放在cookie中的,所以无法避免一些攻击

为了解决以上问题,我们可以使用token方式

2、token

实现流程:

优缺点:

这里的token不存储在服务器,所以不会造成服务器的压力。并且服务器是集群也不需要同步数据到每台机器,不会增加维护成本。token可以存储在前端的任何地方,并不一定需要存储在cookie,提升了页面安全性。可以给token设置有效期,只要在有效期内token就一直有效,但是服务端却不容易收回有效期内token的权限。

token的生成方式:

最常见的生成token的方式是jwt(son web token)。服务器并不存储token,那后端服务是怎么校验token的呢?其实token并不是杂乱无章的字符串。

jwt由三部分组成:header、payload、signature

header 部分指定了该 JWT 使用的签名算法:

header = '{"alg":"HS256","typ":"JWT"}'   // `HS256` 表示使用了 HMAC-SHA256 来生成签名。

playload 部分表明了 JWT 的意图:

payload = '{"loggedInAs":"admin","iat":1422779638}'     //iat 表示令牌生成的时

token的生成

base64Header := encodeBase64(header)

 base64Payload := encodeBase64(payload) 

unsignedToken = base64Header+"."+base64Payload

key := '服务器私钥'

 signature = HMAC(key, unsignedToken)

base64Header := encodeBase64(header)

base64Payload := encodeBase64(payload)

base64Signature := encodeBase64(signature)

token:=base64Header+"."+base64Payload+"."+base64Signature

服务器再校验token时,主要是判断两个方式得到的signatue是否一样

base64Header, base64Payload, base64Signature = token.split('.') 

signature1 = decodeBase64(base64Signature)

unsignedToken = base64Header+"."+base64Payload

signature2 = HMAC('服务器私钥', unsignedToken)

if(signature1 === signature2) {  return '签名验证成功,token 没有被篡改'}  payload =  decodeBase64(base64Payload)

if(new Date() - payload.iat < 'token 有效期'){  return 'token 有效'}

3、sso(单点登录)

概念:

搭建一个认证中心服务,只要在该认证中心服务登录过了之后,就可以登录该服务群的任何一个服务取获取资源。

实现流程:

访问a.com下的页面,先去认证中心进行登录认证

认证中心认证完之后,继续访问a.com下的页面

访问b.com下的页面

由于浏览器存储了访问认证中心sso.com下的cookie,所以已经是登录了认证中心,认证中心直接下发tickit,之后的流程就和访问a.com下的页面差不多了。

sso单点登录退出:

当服务群中的一个服务退出了登录,怎么让服务群中的其它服务也退出登录呢?

当认证中心注册服务的时候,顺便也把服务对应的api也注册好吧

a、c.com退出登录,清空c.com下的cookie

b、请求认证中心下的退出登录api

c、认证中心遍历下发过的ticket的服务,并调用这些服务的退出api

4、OAuth 第三方登录

使用sso登录完成了服务集群登录共享态,但是这是基于一个共同的认证中心,其实实现起来还是比较复杂的。我们其实还可以使用第三方登录,比如微信登录。

a.com 的运营者需要在微信开放平台注册账号,并向微信申请使用微信登录功能。申请成功后,得到申请的 appid、appsecret。