鉴权与OAuth2.0插件功能介绍
在企业发展初期,使用的系统很少,通常是一个或两个,每个系统都有自己的账号和登陆界面,业务人员每天登陆系统并不会很麻烦。但随着企业的发展,用到的系统随之增多,业务人员在操作不同的系统时,需要不同的账号以及多次登陆,但每个系统都要运营不同的账号,对于他们来说很不方便。
那有没有一种办法,可以在一个系统登陆,其他系统就不用登陆了呢?这就是单点登录要解决的问题。单点登录英文全称Single Sign On,简称SSO,意思是在多个应用系统中,只需要登陆一次,就可以访问其他相互信任的应用系统。
实现SSO,需要先了解这类登陆的认证机制,也就是「鉴权」。那么,什么是鉴权,为什么要有鉴权,以及我们如何设置鉴权呢?
「为什么要有鉴权」
可以想象这样一个场景:你住在一个大型的居民小区,小区有门禁系统,进入的时候需要输入密码。你经常网购,因此每天都会有快递员来送货,因此你需要想办法让快递员能够通过门禁系统,进入小区。
可是如果你把自己的密码直接告诉快递员,就相当于他们和你有了一样的身份和权限,好像不太合适。同时,如果后期想要取消某位快递员进入小区的权利,不仅要修改自己的密码,还需要通知其他的快递员,也很麻烦。
那有没有一种办法,可以让快递员不必知道我的密码,但能够自由进入小区送货呢?(唯一的权限就是送货,其他需要密码的场合都没有权限)
于是,有人提出了这样的解决方案:
第一步,在门禁系统(第三方)的密码输入器下面,增加一个按钮,叫做"获取授权"。快递员首先通过按这个按钮,申请授权。
第二步,快递员按下按钮以后,屋主(也就是我)的手机就会跳出对话框:「有人正在要求授权」。系统还会显示该快递员的姓名、工号和所属的快递公司。我确认请求属实,就点击按钮,告诉门禁系统,「我同意给予他进入小区的授权」。
第三步,门禁系统得到我的确认以后,向快递员显示一个进入小区的令牌(access token)。
令牌就是类似密码的一串数字,只在短期内(比如七天)有效。
第四步,快递员向门禁系统输入令牌,进入小区。
和远程为快递员开门相比,为其单独生成一个令牌,可以在解决快递员进小区问题的基础上,同时实现:
1)快递员每天多次送货,一段时间内重复使用同一个令牌;
2)如小区有多重门禁,快递员可使用同一个令牌通过它们。
因此,鉴权(Authentication)其实是在用户资源和第三方应用之间的一个中间层,它将资源和第三方应用隔开,使得第三方应用无法直接访问资源,从而起到保护资源的作用。
为了访问这种受保护的资源,第三方应用(客户端)在访问的时候需要提供凭证。即,需要告诉OAuth你是谁你要做什么。你可以将用户名和密码告诉第三方应用,让第三方应用直接以你的名义去访问,也可以授权第三方应用去访问。
「OAuth2.0是什么」
OAuth2.0是目前最流行的授权机制,用来授权第三方应用,获取用户数据。通常在实际应用中,表现为下面这张图,即会有一个用户「登陆/授权」某「产品/应用」获取用户的个人信息,包括头像、昵称等等,一般出现类似这样的话术,基本就能确定你遇到了OAuth 2.0。
OAuth主要有OAuth1.0和OAuth2.0两个版本,二者完全不同,且不兼容。OAuth2.0是目前广泛使用的版本,我们谈论OAuth时,多数为OAuth2.0。
「如何通过轻流实现OAuth2.0授权」
那么我们如何实现OAuth2.0的授权功能呢?
这里为大家介绍一下轻流提供的SSO-OAuth2.0插件。
首先明确一下它的作用:能够使其他外部系统(后文都以语雀为例)的用户通过语雀提供的授权登录页面,使用语雀的账号密码登录并授权,然后自动以授权用户的身份直接跳转并登录到轻流。
因为存在「授权」这一个概念,OAuth2.0标准为了安全起见,需要用户在授权方“留痕”,通常的方式就是注册一个「应用」,这个应用会生成两个重要参数client_id和client_secret,这两个参数可以唯一定位到一个应用,长期有效。
完整的OAuth2.0需要在语雀和轻流两侧都做一定的配置。
首先以语雀为例,我们需要在语雀中注册一个OAuth应用来“留痕”:
填写完各种信息,点击创建应用,我们可以获得这个应用对应的client_id和client_secret。
注意:如果出现任何安全问题,比如有不应该知道这些参数的人获取到了这两个参数,用户通常可以在应用中手动重置client_secret。
然后,我们在轻流进行相应的配置(本篇文章暂不涉及过于复杂的配置,所以下图两个按钮可以忽略,保持原状态不变即可):
首先介绍一下OAuth2.0认证授权一直到登录的流程:
1、用户访问轻流提供的单点登录链接;
2、登录页面跳转到语雀提供的登录授权页面(本质上是轻流在浏览器发起了一个http请求到语雀,语雀返回了一个登录授权的页面),用户需要以语雀的账号密码登录并「授权应用访问您语雀账号的个人信息等」;
5、轻流获取到语雀回调来的参数,会用这些参数发起第二个http请求,用来换取token,也就是经过用户授权的,用来调用接下来所需接口的参数;
6、轻流根据token拉取语雀账号的昵称、头像图片等数据,然后在轻流工作区根据这些信息创建一个账号并和登录用户的语雀账号做绑定,之后自动登录,下次访问登录链接,登录授权后也会自动登录;
回顾一下流程,我们可以发现,轻流一共发起了三次http请求,对应到轻流的SSO配置中就是:1、请求用户授权设置;2、获取AccessToken配置;3、获取第三方UserId配置。(如下图所示)
因此,轻流SSO的本质就是根据语雀提供的OAuth2.0授权帮助/说明文档,配置完成三个请求,实现语雀到轻流的单点登录。
到此,我们就完成了轻流SSO-OAuth2.0插件的基础配置。此时,当我们想要接入公司后台管理系统或前台业务系统时,灵活运用OAuth2.0授权插件,就能够更加安全便捷的实现,例如:后台系统之间日志模块,发邮件模块,发短信模块等平台资源的互相访问;前台系统用户信息,模块等(用户资源)等互相访问。
OAuth2.0能够帮助企业管理者打通更多的平台,实现更多的数据连接,未来,这些功能也将逐步扩充在轻流学院未来的文章内容中。
想要了解更多更具体的配置操作详解,可参考以下帮助文档:
《创建OAuth应用》https://www.yuque.com/yuque/developer/create-oauth-apps;
《授权OAuth应用》https://www.yuque.com/yuque/developer/authorizing-oauth-apps;
Reference:阮一峰.《OAuth2.0的一个简单解释》http://www.ruanyifeng.com/blog/2019/04/oauth_design.html
素材来源:陈泽
文稿撰写:李颖
文稿审核:陈泽