6-Spring Security OAuth2配置项详解

网友投稿 306 2022-09-16

6-Spring Security OAuth2配置项详解

我们在配置文件中进行了一些配置就完成了第三方OAuth2登录,这些配置项都是啥?配置文件中的gitee配置项是如何写入配置生效的呢?初学者的可能会有点懵逼。本篇将把这个疑问解决掉。

OAuth2配置项的读取

以下是Spring Boot配置文件的配置项示例:

上图在​​application.yml​​中配置的OAuth2信息会被收纳进​​OAuth2ClientProperties​​对象,这里涉及到Spring Boot配置文件的一种读取机制。Spring Boot提供了将具有统一前缀(prefix)的配置项收纳为一个配置对象的能力,通常是以​​Properties​​为后缀的Java对象。

@ConfigurationProperties(prefix = "spring.security.oauth2.client")public class OAuth2ClientProperties implements InitializingBean { /** * OAuth provider details. */ private final Map provider = new HashMap<>(); /** * OAuth client registrations. */ private final Map registration = new HashMap<>(); // 其它略}

具体分为​​Provider​​​和​​Registration​​两个部分。

Registration

客户端在授权服务器的注册信息,包括图中红色标注的9个配置项。

图中① 这个对应​​registration​​​中的​​key​​​,通常称为​​registrationId​​。图中② 是表明其对应授权服务器配置的​​provider​​​的​​key​​​,可以不填,不填时为​​registrationId​​。图中⑤ 是授权类型,参考OAuth2协议中的授权模式。图中⑥ 是第三方平台​​302​​重定向URI。图中⑦ 客户端认证方法,参考​​RFC6749-客户端认证​​​,该参数决定了​​token-uri​​请求参数的组成策略。图中⑧ 是授权范围,在​​yaml​​​中多个用逗号​​,​​隔开;在请求中用空格转义符隔开。

Provider

​​Provider​​指的是授权服务器提供的一些元信息,,包括图中绿色标注的7个配置项。主要是请求端点,包括token、用户信息、授权服务器信息等等。

图中①对应​​registration​​​中的​​provider​​​,大多数情况下和对应的​​registrationId​​一致。图中③是客户端获取token的端点。图中⑤是客户端获取用户信息后,标识用户名的​​key​​,以方便解析用户名。图中⑥是jwkSet的请求端点,获取授权服务器提供的公钥信息。图中⑦是授权服务器提供的元信息端点服务,如果授权服务器提供了该端点前面的​​Provider​​配置项不需要配置,都可以从该端点读取。

OAuth2Properties的读取

从配置文件中提取配置项并封装为​​OAuth2Properties​​​后还不能直接使用,真正可以被使用的是客户端注册信息类​​ClientRegistration​​​。在Spring Boot OAuth2的自动配置中提供了转换适配器​​OAuth2ClientPropertiesRegistrationAdapter​​来进行转换,该适配器高度封装,不可改写,这里没有解读的意义,仅作了解即可。值得一提的是,一些知名的第三方Provider被以枚举类​​CommonOAuth2Provider​​内置进了配置:

public enum CommonOAuth2Provider { GOOGLE { public Builder getBuilder(String registrationId) { Builder builder = this.getBuilder(registrationId, ClientAuthenticationMethod.CLIENT_SECRET_BASIC, "{baseUrl}/{action}/oauth2/code/{registrationId}"); builder.scope(new String[]{"openid", "profile", "email"}); builder.authorizationUri(" builder.tokenUri(" builder.jwkSetUri(" builder.issuerUri(" builder.userInfoUri(" builder.userNameAttributeName("sub"); builder.clientName("Google"); return builder; } }, GITHUB { public Builder getBuilder(String registrationId) { Builder builder = this.getBuilder(registrationId, ClientAuthenticationMethod.CLIENT_SECRET_BASIC, "{baseUrl}/{action}/oauth2/code/{registrationId}"); builder.scope(new String[]{"read:user"}); builder.authorizationUri(" builder.tokenUri(" builder.userInfoUri(" builder.userNameAttributeName("id"); builder.clientName("GitHub"); return builder; } }, FACEBOOK { public Builder getBuilder(String registrationId) { Builder builder = this.getBuilder(registrationId, ClientAuthenticationMethod.CLIENT_SECRET_POST, "{baseUrl}/{action}/oauth2/code/{registrationId}"); builder.scope(new String[]{"public_profile", "email"}); builder.authorizationUri(" builder.tokenUri(" builder.userInfoUri(" builder.userNameAttributeName("id"); builder.clientName("Facebook"); return builder; } }, OKTA { public Builder getBuilder(String registrationId) { Builder builder = this.getBuilder(registrationId, ClientAuthenticationMethod.CLIENT_SECRET_BASIC, "{baseUrl}/{action}/oauth2/code/{registrationId}"); builder.scope(new String[]{"openid", "profile", "email"}); builder.userNameAttributeName("sub"); builder.clientName("Okta"); return builder; } }; private static final String DEFAULT_REDIRECT_URL = "{baseUrl}/{action}/oauth2/code/{registrationId}"; private CommonOAuth2Provider() { } protected final Builder getBuilder(String registrationId, ClientAuthenticationMethod method, String redirectUri) { Builder builder = ClientRegistration.withRegistrationId(registrationId); builder.clientAuthenticationMethod(method); builder.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE); builder.redirectUri(redirectUri); return builder; } public abstract Builder getBuilder(String registrationId);}

只要你​​application.yml​​​配置文件中​​Registration​​​的​​registrationId​​​和枚举名称小写对应,例如​​google​​​对应​​GOOGLE​​​,就可以不用在配置文件中配置​​Provider​​。

小结

简单来说就是​​Provider​​​提供了一些请求端点,​​Registration​​提供了注册在授权服务器上的客户端信息。请求端点带着客户端信息去请求授权(当然这里要遵循OAuth2的流程Flow),授权成功后,再去拿token,然后拿用户信息的过程。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:国家卫健委:17日新增确诊病例11例,均为境外输入病例!
下一篇:[笔记]机器学习之前言介绍
相关文章

 发表评论

暂时没有评论,来抢沙发吧~