最近在组内做了一个Presentation, 主题是关于Web认证方式的介绍。我们组内每两周有一个分享,所有组员轮流分享,顺序是抽签决定的。

Web认证主要分两大块,有密码和无密码。
有密码主要是:BasicAuth, SessionAuth, TokenAuth
无密码则是:OTP, PassKey
密码认证
Basic Auth
BasicAuth是将用户名和密码编码后放在HTTP Header中进行认证,非常简单直白。现在基本上没有正经的网站会用这种方式了,但是我们公司的IT就在用….我也是服气了,弄个Oauth不伦不类的,每次请求得用BasicAuth+用户名密码作为POST才能拿到token.

SessionAuth
SessionAuth是使用sessionid这个cookie来代替密码。服务端需要维护这个session的生命周期。相比BasicAuth这种方式用的地方还比较多。Django的admin site使用的就是session认证。用起来也非常顺手,不过对于前后端分离的API站点来说,这种方式显然不够好。


TokenAuth
所有使用Token的都叫TokenAuth, 使用token来代替密码。因为token可以过期,没有实际的意义,所以泄露了对于网站来说风险不会太大。Token Auth相比session来说就灵活很多,可以放在query里面,可以放在header里面,也可以放在Form里面,Cookie里面也不是不能放。
JWT
Token里面有一种token类型叫做JsonWebToken, 这种token可以携带一定的信息,并且自带校验。通过验证JWT里面的签名就可以知道token是否有效。不好的地方是JWT没办法撤销,一旦签发直到有效期结束都有效,所以一般给的有效期都很短,不要超过24小时。

SSO
Singal Sign-On(单点登录)是一种很方便的认证技术,适用于同一个公司的多个业务间一次登录通行全部。这需要业务系统都依赖于同一个身份源,当用户在一个系统登录后,拿到token,保存在localstorage中,跳转到另外的系统时,如果发现token则直接去身份系统验证,验证通过跳转到相应页面

Oauth
Oauth是一个开放的认证标准,可以用于身份源与业务系统不是同一家公司的情况。目前流行的标准是Oauth2. 我们在网上会看到许多小的网站支持第三方登录,第三方提供了身份源,一般是一些大的服务商如google, apple, wechat, QQ等。小网站通过第三方登录,可以缩减注册的时间,让用户更易于接受登录小网站。

无密码认证
OTP
One Time Password一次性密码。这种方式最近越来越多了。通过手机验证码登录网站或者通过邮箱验证码登录并找回密码等,这些都算是一次性密码。

PassKey
Passkey是一种全新的认证方式。网站不再保存密码,而是保存用户的公钥。登录时用户使用私钥解开公钥加密码随机数,从而确认身份。这就要求用户需要有一个安全且方便的地方保存私钥。这一点随着智能手机的普及已经没有难度了,未来可能会有越来越多的网站支持PassKey
https://www.passkeys.io/ 这个网站目前提供PassKey的Demo。
认证的三因素
在准备这个分享的时候,在某个网站上看到这个信息,叫做three factor to consider for authentication.我感觉很有意思,拿来也一并拿来分享下

通过这三个因素中的一种即可认证,需要两种以上即是多因素认证
授权
提到认证就不得不提授权(Authorization)。
两种常见的授权方式:RBAC, ABAC
RBAC (Role Based Access Control)
通过角色来控制权限。这种方式很常见,也很容易实现。

ABAC (Attribute Based Access Control)
通过属性来控制权限。这种方式实现起来很复杂,一般只有复杂且庞大的系统需要这种授权。ABAC在授权时不仅会考虑用户及资源的属性,还会根据环境的属性动态评估。
举个例子:某家公司的门禁系统,只允许普通员工早上7点到早上7点通过。
这里时间就是一个环境属性。

本文中部分图片来自于互联网,如有侵权,请联系我删除。
(完)