22-Spring Authorization Server初体验

在上一篇中我对授权服务器项目 Spring Authorization Server进行了介绍,这一篇我们来一起看看它是如何搭建、如何使用。先不要纠结为什么要这样配置,先跑起来,后面会去深入探究原因。

本文DEMO:https://gitee.com/felord/spring-security-oauth2-tutorial springauthserver 分支。

本文 Spring Authorization Server版本为​ ​0.2.2​​。

OAuth2 ClientResource Server一样, Spring Authorization Server也是以插件的形式接入 Spring Security的体系中。下面列举了目前必备的环境依赖:

这里要注意几点,环境要求参考​​一文。此外, Spring Authorization Server是需要数据库支持的,这里我依然使用了小巧的 H2数据库。

在实际开发中,你可以通过更换驱动的手段切换到其它类型的数据库,可能会涉及到简单的数据库方言修改或者配置变化。

OAuth2授权服务器专门处理 OAuth2客户端的授权请求流程,授权端点、 Token端点、用户信息端点等等都需要对应的过滤器支持,这些过滤器由 Spring Authorization Server中的​ ​OAuth2AuthorizationServerConfigurer​​负责初始化和配置。我们只需要定义一个优先级最高的过滤器链,把授权服务器配置类初始化并激活即可。

以上是基本配置,关键步骤如下:

[En]

The above is a basic configuration, and the key steps are:

  • 配置与拦截授权服务器相关的请求端点。
    [En]

    configure request endpoints related to intercepting authorization servers.*

  • 由于是接口调用,同时关闭相关端点的CSRF功能。
  • 将配置类加入​ ​HttpSecurity​​激活配置。

按照 OAuth2协议,所有的 OAuth2客户端都应该在授权服务器中进行信息注册。你去申请接入第三方开放平台,都要提交一些信息,第三方平台审核通过后会把一些 OAuth2客户端信息发给你,这些信息你不会陌生,大部分都包含在 OAuth2客户端类库的​ ​OAuth2ClientProperties.Registration​​中,对应 Spring Authorization Server授权服务器的实体为​ ​RegisteredClient​​:

这些属性多数在前面的章节中已经介绍了,​ ​redirect_uri​​​变成了复数以适应多个OAuth2客户端,另外​ ​redirect_uri​​​还有一些隐含规则和操作
,相关源码:

这里简单总结一个要点:

  • ​redirect_uri​​​不能有锚点(​ ​fragment​​​),比如微信DEMO中携带了锚点​ ​#wechat_redirect​​,这种事实上是不符合 OAuth2规范的。
  • ​redirect_uri​​​的​ ​host​​​不能为​ ​null​​​或者​ ​localhost​​,这一点非常重要。
  • 如果​ ​redirect_uri​​​的​ ​host​​不是 环回地址,必须注册到授权服务器,精确匹配到 URI字符串。
  • 如果​ ​redirect_uri​​​的​ ​host​​是 环回地址,可以在调用时切换端口​ ​port​​。

如果 OAuth2授权服务器是 Spring Authorization Server,目前必须严格按照这个规则配置​ ​redirect_uri​​。

OAuth2客户端的一些规则配置,包括:

  • ​REQUIRE_PROOF_KEY​​​ 授权码授权流程中是否需要对密钥进行质询和验证,默认​ ​false​​​。当为​ ​true​​时,开启授权码 PKCE支持​​RFC7636​​。
  • ​REQUIRE_AUTHORIZATION_CONSENT​​ 客户端请求授权时是否添加 同意授权选项。
  • ​JWK_SET_URL​​​ 这个参见​​中相关的描述。
  • ​TOKEN_ENDPOINT_AUTHENTICATION_SIGNING_ALGORITHM​​​ 为​ ​private_key_jwt​​​和​ ​client_secret_jwt​​声明 JWS签名算法。只能用于令牌端点对客户端进行身份验证环节。

​private_key_jwt​​​和​ ​client_secret_jwt​​​参见​ ​ClientAuthenticationMethod​​。

注册 OAuth2客户端时对该客户端令牌的通用规则配置,包含了:

  • ​ACCESS_TOKEN_TIME_TO_LIVE​​​ 访问令牌生存时间,默认​ ​5​​分钟。
  • ​REUSE_REFRESH_TOKENS​​​ 是否可以复用刷新令牌,默认​ ​true​​。
  • ​ID_TOKEN_SIGNATURE_ALGORITHM​OIDC ID Token使用的签名算法,默认​ ​RS256​

你可以通过​ ​TokenSettings.withSettings​​添加额外的自定义属性或者覆盖已有的属性。

我们来初始化一个 OAuth2客户端,这里我们使用的客户端授权方法​ ​ClientAuthenticationMethod​​​是​ ​client_secret_basic​​​,因为之前对应的​ ​basic​​已经不建议使用了:

上面注册的 OAuth2客户端信息需要持久化到数据库,​ ​RegisteredClientRepository​​​接口抽象了对​ ​RegisteredClient​​的持久化操作,这里我们直接启用内置的 JDBC实现以代替默认的内存实现:

这里为了测试,我们在初始化​ ​JdbcRegisteredClientRepository​​的时候保存了一个 OAuth2客户端信息。

资源拥有者的 OAuth2授权状态信息​ ​OAuth2Authorization​​也需要持久化管理, Spring Authorization Server提供了​ ​OAuth2AuthorizationService​​来负责这个工作,我们同样需要启用内置的 JDBC实现以代替默认的内存实现:

如果该客户端配置​ ​ClientSettings​​​开启了授权确认​ ​REQUIRE_AUTHORIZATION_CONSENT​​ ,授权确认的信息也要持久化管理,需要启用内置的 JDBC实现以代替默认的内存实现:

OAuth2客户端注册到授权服务器的注册信息中配置了授权确认功能才有用。

授权服务器 公私钥都需要,参考​​中的方法,结合 Spring Authorization Server提供的方案,我们只需要定义一个​ ​JWKSource​​类型的 Spring Bean即可:

到这里就配置完了。启动项目,访问下面的 issue端点:

返回授权服务器的元信息:

[En]

The meta information of the authorization server will be returned:

这些配置是提供给 OAuth2客户端的,里面也有不少的端点,比如​ ​jwks_uri​​你可以访问一下,看看能否获取公钥 JWK

授权服务器尽量配置域名避免使用​ ​localhost​​。

Spring Authorization Server的类库内置了数据库DDL脚本,在​ ​org/springframework/security/oauth2/server/authorization​​下,分别是

  • ​oauth2-authorization-schema.sql​
  • ​oauth2-authorization-consent-schema.sql​
  • ​oauth2-registered-client-schema.sql​

你可以手动或者借助于​ ​spring.sql.init​​系列命令进行初始化。

Original: https://blog.51cto.com/u_14558366/5547898
Author: qq5d8af00645822
Title: 22-Spring Authorization Server初体验

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/508369/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球