Spring Cloud Security OAuth2授权模式和资源服务器

一、授权模式

1.1授权码模式

下图为授权码模式交互图:
在这里插入图片描述
① 资源拥有者打开客户端,客户端要求资源拥有者给予授权,它将浏览器被重定向到授权服务器,重定向时会附加客户端的身份信息。如:http://localhost:3001/oauth/authorize?client_id=c1&response_type=code&scope=all&redirect_uri=http://www.baidu.com;

参数列表如下:

  • client_id:客户端准入标识
  • response_type:授权码模式固定为code
  • scope:客户端权限
  • redirect_uri:跳转uri,当授权码申请成功后会跳转到此地址,并在后边带上code参数(授权码)

②浏览器出现向授权服务器授权页面,之后将用户同意授权。

③授权服务器将授权码(AuthorizationCode)转经浏览器发送给client(通过redirect_uri)

④客户端拿着授权码向授权服务器索要访问access_token,请求如下:http://localhost:3001/oauth/token? client_id=c1&client_secret=secret&grant_type=authorization_code&code=5PgfcD&redirect_uri=http://w ww.baidu.com

⑤授权服务器返回令牌(access_token)
这种模式是四种模式中最安全的一种模式。一般用于clientWeb服务器端应用或第三方的原生App调用资源服务的时候。因为在这种模式中access_token不会经过浏览器或移动端的App,而是直接从服务端去交换,这样就最大限度的减小了令牌泄漏的风险。

测试:

浏览器访问认证页面:
http://localhost:3001/oauth/authorize?client_id=c1&response_type=code&scope=all&redirect_uri=http://www.baidu.com
在这里插入图片描述
然后输入模拟的账号和密码点登陆之后进入授权页面
在这里插入图片描述
确认授权后,浏览器会重定向到指定路径并附带授权码,最后使用该授权码获取token。
在这里插入图片描述
获取token成功:
在这里插入图片描述

1.2简化模式

下图是简化模式交互图:
在这里插入图片描述

①资源拥有者打开客户端,客户端要求资源拥有者给予授权,它将浏览器被重定向到授权服务器,重定向时会 附加客户端的身份信息。如:http://localhost:3001/oauth/authorize?client_id=c1&response_type=token&scope=all&redirect_uri=http://www.baidu.com
参数描述同授权码模式 ,注意response_type=token

②浏览器出现向授权服务器授权页面,之后将用户同意授权。

③授权服务器将授权码将令牌(access_token)以Hash的形式存放在重定向urifragment中发送给浏览器:
在这里插入图片描述
注:fragment主要是用来标识URI所标识资源里的某个资源,在URI的末尾通过(#)作为 fragment的开头,js通过响应浏览器地址栏变化的方式能获取到fragment就行了。

简化模式用于没有服务器端的第三方单页面应用,因为没有服务器端就无法接收授权码。

1.3密码模式

下图是密码模式交互图:
在这里插入图片描述
①资源拥有者将用户名、密码发送给客户端

②客户端拿着资源拥有者的用户名、密码向授权服务器请求令牌(access_token),请求如下:http://localhost:3001/oauth/token? client_id=c1&client_secret=123&grant_type=password&username=admin&password=admin;只支持POST请求。

参数列表如下:

  • client_id:客户端准入标识
  • client_secret:客户端秘钥
  • grant_type:授权类型,password表示密码模式
  • username:资源拥有者用户名
  • password:资源拥有者密码

③授权服务器将令牌(access_token)发送给client
在这里插入图片描述

注:这种模式意味着直接将用户敏感信息泄漏给了client,因此这就说明这种模式只能用于client是我们自己开发的情况下。因此密码模式一般用于我们自己开发的,第一方原生App或第一方单页面应用。

1.4客户端模式

下图是客户端模式交互图:
在这里插入图片描述
①客户端向授权服务器发送自己的身份信息,并请求令牌(access_token

②确认客户端身份无误后,将令牌(access_token)发送给client,请求如下:http://localhost:3001/oauth/token?client_id=c1&client_secret=123&grant_type=client_credentials,支持POST请求

参数列表如下:

  • client_id:客户端准入标识。
  • client_secret:客户端秘钥。
  • grant_type:授权类型,填写client_credentials表示客户端模式
    在这里插入图片描述
    注:这种模式是最方便但最不安全的模式。因此这就要求我们对client完全的信任,而client本身也是安全的。因此这种模式一般用来提供给我们完全信任的服务器端服务。比如,合作方系统对接,拉取一组用户信息。

二、资源服务器

代码和环境搭建忽略,详情见:https://github.com/hucheng1997/security-oauth2

2.1 资源服务器配置

资源服务器配置类继承ResourceServerConfigurerAdapter重写configure()方法:

public class ResourceServerConfigurerAdapter implements ResourceServerConfigurer {
    public ResourceServerConfigurerAdapter() {}
    public void configure(ResourceServerSecurityConfigurer resources){}
    public void configure(HttpSecurity http){}
}

参数为ResourceServerSecurityConfigurerconfigure()中主要配置:

  • tokenServicesResourceServerTokenServices类的实例,用来实现令牌服务
  • tokenStoreTokenStore类的实例,指定令牌如何访问,与tokenServices配置可选
  • resourceId:这个资源服务的ID,这个属性是可选的,但是推荐设置并在授权服务中进行验证。
  • 其他的拓展属性例如tokenExtractor令牌提取器用来提取请求中的令牌。

参数为HttpSecurityconfigure()中主要配置:

  • 请求匹配器,用来设置需要进行保护的资源路径,默认的情况下是保护资源服务的全部路径。
  • 通过http.authorizeRequests()来设置受保护资源的访问规则
  • 其他的自定义权限保护规则通过HttpSecurity来进行配置。

@EnableResourceServer 注解自动增加了一个类型为OAuth2AuthenticationProcessingFilter 的过滤器链。

2.2 测试

申请令牌:
在这里插入图片描述
访问资源:
在这里插入图片描述
使用错误的token访问资源:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章