一、几种登录方式
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。