OAuth(Open Authorization),是一种开放标准授权协议。用于让用户可以授权第三方系统,访问自己在另一个系统上拥有的资源。
本文主要讲述OAuth里的授权码模式。
考虑如下场景,
比如用户先注册微信,进行实名认证。后来登录了某个微信小程序,为了使用其上的某个功能,微信小程序希望获得用户的微信账号是否实名认证的信息。
这里
微信就是资源系统:用户的资源所在的系统,拥有资源服务和OAuth2.0认证服务。
实名认证信息就是资源。
微信小程序就是三方系统:请求获得用户的资源,实现用户需要的功能。
用户:同时在资源系统和三方系统都拥有账户并需要使用功能,在资源系统拥有数据资源,在三方系统请求使用功能。
这种场景中,如果使用账号名+密码方式的授权方式,那么用户需要给三方系统他的账号名和密码。
三方系统使用用户的账号名+密码登录资源系统,查询获得资源。
注意:这里会有很多的三方系统,三方系统请求的资源各不相同。
这种方式的问题是:
1.用户的密码给了第三方系统,存在极大的个人隐私暴露风险。
2.用户不能随便改自己的密码,一旦改了,那么之前授权给的所有三方系统会失去授权,需要重新授权,非常麻烦。
3.三方系统拿到账号名和密码,登录资源系统后,拥有所有数据资源权限,除了获得当前资源,可以获得用户的任意资源。
4.用户无法管理已授权记录,即取消某一个三方系统授权,或者取消某一个资源的授权。
5.资源系统一般针对账号名+密码登录方式,都会有验证码,或者动态图进行验证,以确认是人工操作。一旦需要给三方系统进行密码授权,那么需要提供单纯的账号名和密码登录。
针对以上问题,OAuth2.0认证方式应运而生。
授权码模式,思路是,创造出授权凭证的概念,通过授权凭证来表示用户授权三方系统访问资源系统的某个资源。
大致流程:
调用关系图:
流程:
注册
首先资源系统需要知道向谁授权了,三方系统需要在资源系统上注册,得到clientId和clientSecret,这是三方系统在资源系统上的认证的身份认证信息。
请求三方系统某个功能
用户打开三方系统页面,请求使用某个功能
登录、授权
用户登录资源系统的账号。操作授权,参数和给予授权的页面链接参数一致。
资源系统生成授权码,对应用户的账号对三方系统的授权,以及授权资源列表。
注意这里要校验回调链接是否合法,通过签名或者配置白名单。
返回三方系统授权回调链接
资源系统返回给用户三方系统的授权回调链接。
这个链接中附带了以下参数:
state参数。
authCode,授权码。用以三方系统获得授权凭证。
访问授权回调链接
用户访问三方系统的访问授权回调链接,触发三方系统执行授权回调。
这个链接中附带了以下参数:
state参数。
authCode,授权码。用以三方系统获得授权凭证。
获得授权凭证
三方系统向资源系统请求授权凭证。附带参数:clientId,clientSecret,authCode。
资源系统校验clientId,clientSecret,authCode通过,生成记录授权凭证,表示用户的账号对三方系统的授权,以及授权的资源列表。将授权凭证返回给三方系统。
三方系统拿到授权凭证,根据state拿到上下文参数,包括用户账号id,将授权凭证和用户账户id映射存储。
根据授权凭证请求资源
三方系统用授权凭证向资源系统资源服务请求资源。
参数:授权凭证
校验授权凭证
资源系统资源服务向认证服务校验授权凭证。
认证服务校验通过。
10.返回资源数据
资源系统资源服务向三方系统返回资源数据。
11.返回功能处理结果
三方系统拿到资源数据,完成功能操作,向用户返回功能处理结果。
后续,
资源系统存储了用户向三方系统授权资源的授权凭证。后续用户可以查看、变更及删除等。
三方系统存储了用户的授权凭证,后续都可以根据授权凭证请求资源。