Published on

OAuth 2.0 授权码模式详解与企业级应用实践

Authors
  • avatar
    Name
    Liant
    Twitter
一、OAuth2.0介绍
流程:
avator

(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啥的。

授权码模式
avator

(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"
    }