前端开发登录鉴权方案完全梳理 🌟🌟🌟
注:此处主要讲的是 http 鉴权涉及 API 鉴权,主要场景是将接口提供给前端或第三方使用时需要鉴权,而非用户登录系统。通常在当前流行的微服务中,主要在 gateway 层做相关认证,下游链路是默认开放的。
概念明确:
通常四者的关系是:认证 --> 授权 --> 鉴权 --> 权限控制
在不涉及权限控制的系统中,一般到鉴权这一步就能拿到数据。
下面讲集中常用的鉴权方式:
在 header 头中加入 ‘Authorization: Basic dXNlcjE6MTIzNDU2’,其中 dXNlcjE6MTIzNDU2 是 user1:123456 base64 编码之后的结果, 其为用户名密码,这种方式非常简单且极易被破解,仅做了解。
使用方式:
// header
Authorization: Basic dXNlcjE6MTIzNDU2
概念:
cookie: 服务端下发给浏览器端的数据,浏览器每次发送请求都会携带这段数据
session: 服务端保存生成的 session 信息,客户端在收到 session 信息后会在下次请求时带上 session_id,服务端查找到对应的会话信息来持续之前断掉的会话,cookie 和 session 都弥补了 http 是个无状态协议这一特点。与 cookie 的区别如下:
时序图:
使用 session-cookie 鉴权的时序图如下:
优势:
缺点:
使用方式:
// header
cookie: sessionid=123456
使用场景:
时序图:
使用 token 鉴权的时序图
和 session-cookie 的区别在于:token 是 session-cookie 的升级版
优点:
缺点:
概念
refresh token 的概念和 access token 密切相关
Access Token: 用来访问业务接口,由于有效期足够短,盗用风险小,也可以使请求方式更宽松灵活;
Refresh Token: 用来获取 Access Token,有效期可以长一些,通过独立服务和严格的请求方式增加安全性;由于不常验证,也可以如前面的 Session 一样处理;一般如果 refresh Token 也过期了则需要重新登录。
概念:
对 JSON 进行加密签名来实现授权验证的方案
组成:
{
"alg": "HS256",
"typ": "JWT"
}
Payload: claim 即通常包含 user 信息以及实际需要传递的数据,官方定义了如下七个字段供使用,但也可以自己加私有字段
{
"iss": "Jehoshaphat Tse",
"iat": 1441593502,
"exp": 1441594722,
"aud": "www.example.com",
"sub": "mrsingsing@example.com",
"name": "John Doe",
"admin": true
}
signature 签名,对前面两部分进行签名,防止数据被篡改
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
其中 secret 是一个密钥,只有服务器知道,不会泄露给用户,使用的签名算法是 header 中指定的,默认即 HMAC SHA256
优势:
缺点:
时序图:
使用方式:
// header
Authorization: Bearer <token>
通常将 jwt 存储在 localStorage 中
使用场景:
不需要服务端保存用户状态的场景。但通常如果考虑到 token 注销的场景的话,没有特别好的解决方案,大部分解决方案是给 token 加状态,比如为每个用户创建专属 secret 有点类似于 session-cookie 认证了,对于续签的问题可以通过每次请求都返回新的 token 的方式或即将过期的时候服务端即重新颁发新的给客户端。
总结 jwt 的做法其实我们可以借鉴做一下 jwt 的变形,比如 header 中使用如下验证方式:
// header
// ts 用于校验时间
// sign 用于保证数据不被篡改
// 发送给服务端后对比签名是否一样(需要客户端和服务端都知道密钥才能按相同的算法生成签名)
timestamp+signature(secret, payload)
概念:
多系统应用群中登录单个系统即可在其他系统中获得授权无需再次登录其他系统即可使用。
当存在两个相同域名下的系统 A a.abc.com
和系统 B b.abc.com
时,以下为他们实现 SSO 的步骤:
a.abc.com
),如果没有登录,则跳转至 SSO 认证中心提供的登录页面进行登录set-cookie
字段中,随着请求返回写入浏览器中。abc.com
,浏览器会自动带上之前的 Cookie。此时服务端就可以通过该 Cookie 来验证登录状态了,注意防 xss 需要设置 cookie 为 http-only。这实际上使用的就是 Session-Cookie 认证的登录方式。
由于跨域,cookie 不能共享了,比如我们登录了 taobao.com 希望同时能登上 tmall.com
SAML Web SSO学习 🌟🌟🌟
概念:
saml security assertion markup language: 安全断言标记语言
SP service provider:服务提供方,如阿里云控制台、aws 控制台等
IdP identity provider: 身份提供方,能够向 SP 发送身份断言,即标识某个人身份的 token,且在 saml 协议中其为 xml 形式
通常 SP 和 IdP 互相存着对方的 MetaData
组成:
时序图:
常用于云服务中
简介
AK: Access Key Id,用于标示用户;
SK: Secret Access Key,是用户用于加密认证字符串和服务端用来验证该字符串的密钥,因此 SK 必须保密;
综上 aksk 其实是通过使用 Access Key Id / Secret Access Key 加密的方法来验证某个请求的发送者身份。
使用流程
判断用户请求中是否包含 Authorization 认证字符串。如果包含认证字符串,则执行下一步操作。
基于HTTP请求信息,使用相同的算法,生成Signature字符串。
使用服务器生成的Signature字符串与用户提供的字符串进行比对,如果内容不一致,则认为认证失败,拒绝该请求;如果内容一致,则表示认证成功,系统将按照用户的请求内容进行操作。
客户端:
1. 构建http请求(包含 access key);
2. 使用请求内容和 secret access key 计算的签名(signature);
3. 发送请求到服务端;
服务端:
1. 根据发送的 access key 查找数据库得到对应的 secret-key;
2. 使用同样的算法将请求内容和 secret-key 一起计算签名(signature),与客户端步骤2相同;
3. 对比用户发送的签名和服务端计算的签名,两者相同则认证通过,否则失败。