spring security oauth2
概念
允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用或分享他们数据的所有内容。
应用场景
假如我们公司开发了一个想美图秀秀的APP,用户登陆我们的APP,要想获取存在QQ空间里面的照片,之前的做法是直接把用户的账号和密码告诉APP,这样当然是可以获取用户空间的照片,但用户其它一些隐私(例如:用户好友列表)也告诉了APP,这时用户的隐私安全就受到威胁。这时我们可以采用Oauth2.0来解决,给APP只赋予查看QQ空间的权限,并且时间也是有限的
OAuth中的重要角色
(1) Third-party application:第三方应用程序,本文中又称"客户端"(client),即上一节例子中的"云冲印"。
(2)HTTP service:HTTP服务提供商,本文中简称"服务提供商",即上一节例子中的Google。
(3)Resource Owner:资源所有者,本文中又称"用户"(user)。
(4)User Agent:用户代理,本文中就是指浏览器。
(5)Authorization server:认证服务器,即服务提供商专门用来处理认证的服务器。
(6)Resource server:资源服务器,即服务提供商存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。
运行流程
OAuth 提供了四种授权模式:
- 授权码模式 Authorization code
- 简化模式 implicit
- 密码模式 resource owner Password credentials
- 客户端模式 client credentials
四种授权模式在我们项目中,授权码模式,和密码模式使用的最多,其它两种授权模式使用的较少
授权码模式
授权码模式也是授权模式里面最复杂的一种,分为两个步骤:
步骤一:
引导用户到授权服务器,请求用户授权,用户授权后返回 授权码(Authorization Code)
步骤二:
客户端由授权码到授权服务器换取访问令牌(Access Token)
在步骤一中,客户端申请认证的URI,包含以下参数:
response_type:表示授权类型,必选项,此处的值固定为"code"
client_id:表示客户端的ID,必选项
redirect_uri:表示重定向URI,可选项
scope:表示申请的权限范围,可选项
state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
下面是一个例子:
localhost:8080/oauth/authorize?response_type=code&redirect_uri=https://www.baidu.com/&client_id=myid&scope=all
当我们同意授权后,会跳转到redirect_uri指定的地址,并返回授权码code
步骤二:我们拿到步骤一返回的code去获取access_token,请求包含如下参数
grant_type:表示使用的授权模式,必选项,此处的值固定- 为"authorization_code"。
code:表示上一步获得的授权码,必选项。
redirect_uri:表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致。
client_id:表示客户端ID,必选项。
scope 授权范围,与步骤一socpe保持一致。
密码模式
用户将账号和密码提供为第三方引用,第三方引用拿着这些信息向服务提供商获取access_token
第三方应用引用拿着用户信息获取access_token,包含的参数有:
grant_type:表示授权类型,此处的值固定为"password",必选项
username:表示用户名,必选项
password:表示用户的密码,必选项
scope:表示权限范围,可选项
想更多的学习关于OAuth2.0的知识,可以看阮一峰老师的文章
http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
上一篇: Spring Security OAuth2整合JWT
下一篇: oauth2.0---heima