linux怎么查看本机内存大小
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和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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~