SpringCloudOAuth2--概述

什么是OAuth2

0Auth2是一个标准的授权协议。OAuth2 取代了在2006年创建的OAuth1 的工作,OAuth2对OAuth1没有做兼容,即完全废弃了0Auth1。0Auth2 允许不同的客户端通过认证和授权的形式来访问被其保护起来的资源。在认证和授权的过程中,主要包含以下3种角色。

  • 服务提供方Authorization Server
  • 资源持有者Resource Server
  • 客户端Client

OAuth2的认证流程图如下:
在这里插入图片描述

  1. 用户(资源持有者)打开客户端,客户端 客户端询问用户授权。
  2. 用户同意授权。
  3. 客户端向授权服务器申请授权。
  4. 授权服务器对客户端进行认证,也包括用户信息的认证,认证成功后授权给予令牌。
  5. 客户端获取令牌后,携带令牌向资源服务器请求资源
  6. 资源服务器确认令牌正确无误,向客户端释放资源。

如何使用Spring OAuth2

OAuth2协议在Spring Resources中的实现为Spring OAuth2。Spring OAuth2分为两部分,分别是OAuth2 Provider和OAuth2 Client,下 面来对二者逐一讲解。

一. OAuth Provider:

OAuth2Provider负责公开被OAuth2保护起来的资源。OAuth2Provider需要配置代表用户的OAuth2客户端信息,被用户允许的客户端就可以访问被OAuth2保护的资源。
OAuth2Provider通过管理和验证0Auth2令牌来控制客户端是否有权限访问被其保护的资源。另外,Oauth2 Provider 还必须为用户提供认证API接口。根据认证API接口,用户提供账号和密码等信息,来确认客户端是否可以被0Auth2 Provider 授权。这样做的好处就是第三方客户端不需要获取用户的账号和密码,通过授权的方式就可以访问被OAuth2保护起来的资源。

OAuth2 Provider的角色被分为Authorization Service (授权服务)和Resource Service (资源服务),通常它们不在同一个服务中,可能一个Authorization Service 对应多个ResourceService。Spring OAuth2需配合Spring Security一起使用,所有的请求由Spring MVC控制器处理,并经过一系列的Spring Security过滤器。

在Spring Security过滤器链中有以下两个节点,这两个节点是向Authorization Service获取验证和授权的:

  • 授权节点:默认为/oauth/authorize
  • 获取Token节点:默认为/oauth/token

1. Authorization Server配置:

在配置Authorization Server 时,需要考虑客户端(Client) 从用户获取访问令牌的授权类型(例如授权代码、用户凭据、刷新令牌)。Authorization Server需要配置客户端的详细信息和令牌服务的实现。

在任何实现了AuthorizationServerConfigurer 接口的类上加@EnableAuthorizationServer注解,开启Authorization Server 的功能,以Bean的形式注入Spring IoC容器中,并需要实现以下3个配置:

  • ClientDetailsServiceConfigurer:配置客户端信息
  • AuthorizationServerEndpointsConfigurer:配置授权Token的节点和Token服务
  • AuthorizationServerSecurityConfigurer:配置Token节点的安全策略

ClientDetailsServiceConfigurer:

客户端的配置信息既可以放在内存中,也可以放在数据库中,需要配置以下信息:

  • clientId:客户端Id,需要在Authorization Server中是唯一的;
  • secret:客户端的密码;
  • scope:客户端的域;
  • authorizedGrantTypes:认证类型;
  • authorities:权限信息;

客户端信息可以存储在数据库中,这样就可以通过更改数据库来实时更新客户端信息的数据。Spring OAuth2已经设计好了数据库的表,且不可变。创建数据库的脚本如下:

create table oauth_client_details (
  client_id VARCHAR(128) PRIMARY KEY,
  resource_ids VARCHAR(128),
  client_secret VARCHAR(128),
  scope VARCHAR(128),
  authorized_grant_types VARCHAR(128),
  web_server_redirect_uri VARCHAR(128),
  authorities VARCHAR(128),
  access_token_validity INTEGER,
  refresh_token_validity INTEGER,
  additional_information VARCHAR(4096),
  autoapprove VARCHAR(128)
);

create table oauth_client_token (
  token_id VARCHAR(128),
  token BLOB,
  authentication_id VARCHAR(128) PRIMARY KEY,
  user_name VARCHAR(128),
  client_id VARCHAR(128)
);

create table oauth_access_token (
  token_id VARCHAR(128),
  token BLOB,
  authentication_id VARCHAR(128) PRIMARY KEY,
  user_name VARCHAR(128),
  client_id VARCHAR(128),
  authentication BLOB,
  refresh_token VARCHAR(128)
);

create table oauth_refresh_token (
  token_id VARCHAR(128),
  token BLOB,
  authentication BLOB
);

create table oauth_code (
  code VARCHAR(128), authentication BLOB
);

create table oauth_approvals (
    userId VARCHAR(128),
    clientId VARCHAR(128),
    scope VARCHAR(128),
    status VARCHAR(10),
    expiresAt TIMESTAMP,
    lastModifiedAt TIMESTAMP
);


-- customized oauth_client_details table
create table ClientDetails (
  appId VARCHAR(128) PRIMARY KEY,
  resourceIds VARCHAR(128),
  appSecret VARCHAR(128),
  scope VARCHAR(128),
  grantTypes VARCHAR(128),
  redirectUrl VARCHAR(128),
  authorities VARCHAR(128),
  access_token_validity INTEGER,
  refresh_token_validity INTEGER,
  additionalInformation VARCHAR(4096),
  autoApproveScopes VARCHAR(128)
);

AuthorizationServerEndpointsConfigurer:

在默认情况下,AuthorizationServerEndpointsConfigurer配置开启了所有的验证类型,除了密码类型的验证,密码验证只有配置了authenticationManager的配置才会开启。AuthorizationServerEndpointsConfigurer配置由以下5项组成:

  • authenticationManager:只有配置了该选项,密码认证才会开启。在大多数情况下都是密码验证,所以一般都会配置这个选项。
  • userDetailsService:配置获取用户认证信息的接口。
  • authorizationCodeServices:配置验证码服务。
  • implicitFrantService:配置管理implict验证的状态。
  • tokenGranter:配置Token Granter。

另外,需要设置Token的管理策略,目前支持以下3种:

  • InMemoryTokenStore:Token存储在内存中;
  • JdbcTokenStore:Token存储在数据库中。需要引入spring-jdbc的依赖包,并配置数据源,以及初始化Spring OAuth2的数据库脚本;
  • JwtTokenStore:采用JWT形式,这种形式没有做任何的存储,因为JWT本身包含了用户验证的所有信息,不需要存储。采用这种形式,需要引入spring-jwt的依赖;

QuthorizationServerSecurityConfigurer:

如果资源服务和授权服务是在同一个服务中,用默认的配置即可,不需要做其他任何的配置。但是如果资源服务和授权服务不在同一个服务中,则需要做一些额外配置。如果采用RemoteTokenServices ( 远程Token校验),资源服务器的每次请求所携带的Token都需要从授权服务做校验。这时需要配置“/oauth/check_ token" 校验节点的校验策略。

Authorization Server的配置比较复杂,细节较多,Authorization Server的配置思维导图如图所示。

通过在实现了AuthorizationServerConfigurer 接口的类上加@EnableAuthorizationServer注解,开启AuthorizationServer的功能,并注入IoC容器中。然后需要配置ClientDetailsServiceConfigurer、AuthorizationServerSecurityConfigurer和AuthorizationServerEndpointsConfigurer,它们有很多可选的配置,需要慢慢理解。

在这里插入图片描述

2. Resource Server的配置:

Resource Server ( 可以是授权服务器,也可以是其他的资源服务)提供了受OAuth2保护的资源,这些资源为API接口、Html页面、Js文件等。

Spring OAuth2 提供了实现此保护功能的Spring Security 认证过滤器。在加了@Configuration注解的配置类上加@EnableResourceServer注解,开启Resource Server的功能,并使用ResourceServerConfigurer进行配置( 如有必要),需要配置以下的内容:

  • tokenServices: 定义Token Service。例如用ResourceServerTokenservices 类,配置Token
    是如何编码和解码的。如果Resource Server和Authorization Server在同一个工程上,则不需要配置tokenServices, 如果不在同一个程序就需要配置。也可以用RemoteTokenServices类,即Resource Server 采用远程授权服务器进行Token解码,这时也不需要配置此选项,本章案例采用此方式。
  • resourceld:配置资源Id。

二. OAuth2 Client:

OAuth2 Client (客户端)用于访问被OAuth2保护起来的资源。客户端需要提供用于存储用户的授权码和访问令牌的机制,需要配置如下两个选项:

  • Protected Resource Configuration(受保护资源配置)
  • Client Configuration(客户端配置)

1. Protected Resource Configuration:

使用OAuth2ProtectedResourceDetails类型的Bean来定义受保护的资源,受保护的资源具有以下属性:

  • Id:资源的ID,它在Spring OAuth2协议中没有用到,用于客户端寻找资源,不需要做配置,默认即可;
  • clientId:OAuth2 Client的Id,和之前OAuth2 Provider中的一一对应;
  • clientSecret:客户端密码,和之前OAuth2 Provider中配置的一一对应;
  • accessTokenUri:获取Token的API节点;
  • scope:客户端的域;
  • clientAuthenticationScheme:有两种客户端验证类型,分别为Http Basic 和 Form,默认为Http Basic;
  • userAuthorizationUri:如果用户需要授权访问资源,则用户将被重定向到认证Url;

2. Client Configuration:

对于OAuth2 Client的配置,可以使用@EnableOAuth2Client注解来简化配置,另外还需要配置以下两项:

  • 创建一个过滤器Bean(Bean的Id为oauth2ClientContextFilter),用来存储当前请求和上下文的请求。在请求期间,如果用户需要进行身份验证,则用户会被重定向到OAuth2的认证Url;
  • 在Request域内创建AccessTokenRequest类型的Bean;

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值