SpringSecurity+OAuth2入门
# SpringSecurity + OAuth2 入门
# OAuth2.0 是什么?
OAuth(Open Authorization)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。
很多团队,内部会采用 OAuth2.0 实现一个授权服务,避免每个上层应用或者服务重复开发。
OAuth 允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。
每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的 2 小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth 让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。
如果对接过微信网页授权 (opens new window)功能,就会发现分成两种方式:静默授权、手动授权。
前者只能获取到用户的 openid,而后者可以获取到用户的基本信息。
OAuth2.0 是用于授权的行业标准协议。OAuth2.0 为简化客户端开发提供了特定的授权流,包括 Web 应用、桌面应用、移动端应用等。
OAuth 1.0 协议体系本身存在一些问题,现已被各大开发平台逐渐废弃。
# OAuth2.0 角色
在 OAuth2.0 中,有如下角色:
Authorization Server:授权服务器,用于认证用户。如果客户端认证通过,则发放访问资源服务器的令牌。
Resource Server:资源服务器,拥有受保护资源。如果请求包含正确的访问令牌,则可以访问资源。
- 提供管理后台、客户端 API 的服务,都可以认为是 Resource Server。
Client:客户端。它请求资源服务器时,会带上访问令牌,从而成功访问资源。
- Client 可以是浏览器、客户端,也可以是内部服务。
Resource Owner:资源拥有者。最终用户,他有访问资源的账号与密码。
- 可以简单把 Resource Owner 理解成人,他在使用 Client 访问资源。
# OAuth 2.0 运行流程
如下是 OAuth 2.0 的授权码模式的运行流程:
- 用户打开客户端以后,客户端要求用户给予授权。
- 用户同意给予客户端授权。(关键,即如何)
- 客户端使用上一步获得的授权,向认证服务器申请令牌。
- 认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
- 客户端使用令牌,向资源服务器申请获取资源。
- 资源服务器确认令牌无误,同意向客户端开放资源。
# OAuth 2.0 授权模式
客户端必须得到用户的授权(Authorization Grant),才能获得访问令牌(Access Token)。
OAuth2.0 定义了四种授权方式:
- (常用)授权码模式(Authorization Code)
- 密码模式(Resource Owner Password Credentials)
- 简化模式(Implicit)
- 客户端模式(Client Credentials)
具体而言,网页授权流程分为四步:
- 引导用户进入授权页面同意授权,获取 code
- 通过 code 换取网页授权 access_token(与基础支持中的 access_token 不同)
- 如果需要,开发者可以刷新网页授权 access_token,避免过期
- 通过网页授权 access_token 和 openid 获取用户基本信息(支持 UnionID 机制)
# 密码模式
密码模式,
- 用户向客户端提供自己的用户名和密码。
- 客户端使用这些信息,向授权服务器索要授权。
在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。这通常用在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分,或者由一个著名公司出品。而授权服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。
如果客户端和授权服务器都是自己公司的,显然符合。
操作流程如下:
- 【用户】向【客户端】提供用户名和密码。
- 【客户端】将用户名和密码发给【授权服务器】,向后者请求令牌。
- 【授权服务器】确认无误后,向【客户端】提供访问令牌。
# 授权码模式
授权码模式,是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与授权务器进行互动。
一般情况下,在有客户端的情况下,我们与第三方平台常常采用这种方式。
操作流程如下:
- 用户访问客户端,后者将前者跳转到到授权服务器。
- 用户选择是否给予客户端授权。
- 假设用户给予授权,授权服务器将跳转到客户端事先指定的"重定向 URI"(Redirection URI),同时附上一个授权码。
- 客户端收到授权码,附上早先的"重定向 URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。
- 授权服务器核对了授权码和重定向 URI,确认无误后,向客户端发送访问令牌。