- Published on
OAuth 2.0 授权码模式详解与企业级应用实践
- Authors
- Name
- Liant
一、OAuth2.0介绍
流程:

(A) 用户打开某个客户端(比如scrm),客户端需要获取用户在oa的信息,要求oa用户给予授权。
(B) 用户同意给予客户端授权(我们的应用默认就是同意,不需要用户去手动触发,这一步可以忽略),oa下发一个凭证(code)。
(C) 客户端使用上一步获得的凭证,向认证服务器申请令牌。
(D) 认证服务器对客户端进行认证以后,确认无误,同意发放令牌(access_token)。
(E) 客户端使用令牌,再次向资源服务器申请获取用户的身份信息。
(F) 资源服务器确认令牌无误,同意向客户端开放资源。
优势:
允许用户授权第三方网站或应用,访问用户存储在其它网站上的资源,而不需要将用户名和密码提供给第三方网站或分享他们数据的内容
对于用户:免去了繁琐的注册过程,降低了注册成本,提高了用户体验
对于消费方:简化自身会员系统的同时又能够带来更多的用户和流量
对于服务提供者:围绕自身进行开发,增加用户粘性
二、OAuth角色
OAuth2.0定义了几种角色:资源所有者、客户端、资源服务器、授权服务器、用户代理。分别对这几种角色结合我们的oa系统做一个介绍
- 资源所有者(Resource Owner)
理解为用户,在oa系统里面就是公司的普通员工,资源就是指这些员工的各种信息。
- 客户端(Client)
理解为外部应用,在oa系统里面就是应用列表中各种应用,它们虽然是嵌套在oa系统内,但只是提供了一个跳转的入口,跟oa没有关系。这些应用最终是需要获取oa的用户数据的,对于oa来讲,这些应用就是外部应用。
- 资源服务器(Resource Server)
保存资源的服务器,上面说到资源所有者是oa的员工,那这里的资源服务器就是oa系统本身。
- 授权服务器(Authorization Server)
授权服务器是专门用来权限鉴定的,分发授权码,验证外部请求是否合法。这个服务器可以是一个独立的应用(专门部署成一个项目),也可以和资源服务器在一起,oa系统授权服务器就是一个第三方的composer包,与oa系统存在于一个项目中。
- 用户代理(User Agent)
用户代理可以理解为浏览器,主要的作用就是做中间的跳转。
三、OAuth模式
在使用OAuth2.0的授权之前,我们需要先注册服务。OAuth2.0一共有四种授权模式:授权码授权模式、隐式授权模式、密码授权模式、客户端凭证授权模式,这里我们只关心oa使用的模式,即授权码模式。
注册应用
首先在资源服务器(服务提供方)注册我们的应用,在我们公司内部,这个服务器就是oa,创建应用需要几个参数:
应用名称
应用网站地址
跳转地址
资源服务器会将这几个参数传递给授权服务器,授权服务器生成ClientId和ClientSecret。然后将ClientId和ClientSecret发放外部应用使用。我们oa系统里面还加了一些其他自定义的参数,网站logo啥的。
授权码模式

(A) 用户访问客户端(比如scrm),客户端将用户引导向认证服务器,在oa系统里面,这个认证地址是,只是在这里多加了一个登陆
https://oauth-oa.looip.com/authorize?response_type=code&client_id=oa&redirect_uri=https://scrm.looip.com/login&state=1567906443
(B) 用户选择是否给予客户端授权(我们自己的应用默认全部同意授权,不需要用户去手动触发跳转)。
(C) 如用户给予授权,认证服务器将用户引导向客户端指定的redirection uri,同时加上授权码code。
https://scrm.looip.com/login?code=042ebe6fae3765f16320c93c2a8db50286e22746
(D) 客户端收到code后,通过后台的服务器向认证服务器(oa系统)发送code和redirection uri。
(E) 认证服务器验证code和redirection uri,确认无误后,响应客户端访问令牌(access token)和刷新令牌(refresh token),客户端就可以拿着这个令牌为所欲为了。
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value"
}