背景
因为最近项目需要被当成类似第三方平台提供接口的调用。因此要保证接口调用的安全性,拒绝“裸奔”,项目中使用OAuth2协议进行开发。
什么是OAuth2?
OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAuth保证了我们在分布式系统开发的情况下接口调用的安全性,在资源服务器中进行设置拦截的请求需要进行Token校验,就需要在验证服务器上进行校验Token的有效性,有效即可以进行访问。
如何使用OAuth2?
在使用OAuth2之前要首先知道一些概念:
名词定义
-
Third-part application(第三方应用程序)
当我们要打开某些应用程序需要QQ登陆、微信登陆、微博登陆的时候,QQ、微信、微博即为第三方应用程序,用户需要对其进行授权
-
Http service(服务提供商)
上文中QQ、微信、微博我们进行授权之后,他会对我们进行服务的提供,此为服务提供商
-
Resources Owner
资源所有者,本文中简称“用户”
-
User Agent
用户代理,本文就是指浏览器
-
Authorization Server
认证服务器,即服务提供商专门用来处理认证的服务器
-
Resource server
资源服务器,即服务提供商存放用户生成的资源的服务器
授权模式
OAuth2有四种授权模式分别为:
-
授权码模式(authorization code)
介绍:
授权码模式是功能最完整、流程最严密的授权模式。他的特点就是通过客户端的后台服务器,与“服务提供商”的认证服务器进行互动。流程为:
(A) 用户访问客户端,后者将前者导向认证服务器
(B) 用户选择是否给与客户端授权
(C) 假设用户给予授权,认证服务器将用户导向客户端事先指定的“重定向URI”,同时附上一个授权码
(D) 客户端收到授权码,附上早先的重定向URI,向认证服务器申请令牌,这一步是在客户端的后台的服务器上完成的,对用户不可见。
(E) 认证服务器核对了授权码和重定向URI,确认无误之后,向客户端发送访问令牌(access token)和更新令牌(refresh token)
详情图
-
简化模式(implicit)
介绍:
简化模式不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了授权码这个步骤,因此得名,所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。流程为:
(A) 客户端将用户导向认证服务器
(B) 用户决定是否给客户端授权
(C) 假设用户给予授权,认证服务器将用户导向客户端指定“重定向URI”,并在URI的Hash部分包含了访问令牌
(D) 浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值
(E) 资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌
(F) 浏览器执行上一步获得的脚本,提取出令牌
(G) 浏览器将令牌发给客户端。详情图
-
密码模式(password)
介绍:
密码模式中,用户向客户端提供自己的用户名和密码,客户端使用这些信息,向“服务商提供商”索要授权。在这种模式中,用户必须把自己的密码给客户端,但是客户端不得存储密码,这通常用在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分,或者由一个著名的公司出品,而认证服务器只有在其他授权模式无法致性的情况下,才能考虑从使用这种模式。流程为:
(A) 用户向客户端提供用户名和密码
(B) 客户端将用户名和密码发给认证服务器,向后者请求令牌
(C) 认证服务器确认无误后,向客户端提供访问令牌详情图
-
客户端模式(client credentials)
介绍:
客户端模式指客户端以自己的名义,而不是以用户名义,向服务提供商进行认证。严格的说,客户端模式并不属于OAuth框架所需要解决的问题,在这种模式中,用户直接向客户端注册,客户端以自己的名义要求“服务提供商”提供服务,其实不存在授权问题。流程为:
(A) 客户端向认证服务器进行身份认证,并要求一个访问令牌。
(B) 认证服务器确认无误后,向客户端提供访问令牌详情图
注意
上面四种授权模式都遵守规范需要携带一些参数:具体的报文格式跟响应数据请到官网查看
官网地址:
https://oauth.net/2/
总结
本人将用Spring-Security整合OAuth2进行整合使用。学习OAuth2之前需要了解Spring Security一些知识,没了解过建议去看几篇博客。写给demo入门即可。接下来将进行代码实战,项目主要使用了密码模式跟客户端模式进行开发