在上一篇中我对授权服务器项目 Spring Authorization Server进行了介绍,这一篇我们来一起看看它是如何搭建、如何使用。先不要纠结为什么要这样配置,先跑起来,后面会去深入探究原因。
本文DEMO:https://gitee.com/felord/spring-security-oauth2-tutorial springauthserver 分支。
本文 Spring Authorization Server版本为
​0.2.2​
。
像 OAuth2 Client、 Resource 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/
转载文章受原作者版权保护。转载请注明原作者出处!