https://zhuanlan.zhihu.com/p/664056085
背景
很多的网站、APP 都弱化了甚至没有搭建属于自己的账号体系,而是使用其它社会化的第三方登陆的方式,比如在登陆某个网站的时候选择通过 github 或者微信、微博等方式登陆,这样不仅免去了用户注册账号的麻烦,还可以获取用户的好友关系来增强自身的社交功能。
例如要通过 github 这样的第三方网站去登陆某个没有自己账号体系的平台,最传统的方式是直接在该平台的登陆页面输入 github 的账号密码,该平台通过用户的账号和密码去 github 上面获取用户的数据,但是这样做有很多缺陷:
- 该平台需要明文保存用户的 github 账号和密码,不安全;
- 该平台拥有获取用户在 github 的所有权限;
- 用户只有修改密码,才能收回赋予该平台的权限,会导致其它获得用户授权的第三方应用全部失效;
- 只要有一个第三方应用程序被破解,就会导致用户密码泄露,以及所有使用 github 登陆过的网站的数据泄漏;
为了解决以上问题,就有了 OAuth。
原理
OAuth在“客户端”和“服务端”之间设置了一个授权层(authorization layer)。“客户端”不能直接登陆“服务端”,只能登陆授权层,以此将用户与客户端区分开来。“客户端”登陆授权层所用的oken与用户的密码不同,用户可以在登陆的时候,指定授权层 token 的权限范围和有效期。