当前位置: 首页 > news >正文

浙江网站开发网站开发的理解

浙江网站开发,网站开发的理解,h5个人网站源码,公司加盟代理OAuth 2.0 Login OAuth 2.0 Login 功能允许应用程序让用户通过使用 OAuth 2.0 Provider (如 GitHub)或 OpenID Connect 1.0 Provider (如 Google)的现有帐户登录到应用程序。OAuth 2.0 Login 实现了两个用例: “ Login with Google”或“ Login with GitHub”。 OAuth 2.0 Lo…OAuth 2.0 Login OAuth 2.0 Login 功能允许应用程序让用户通过使用 OAuth 2.0 Provider (如 GitHub)或 OpenID Connect 1.0 Provider (如 Google)的现有帐户登录到应用程序。OAuth 2.0 Login 实现了两个用例: “ Login with Google”或“ Login with GitHub”。 OAuth 2.0 Login 是通过使用授权代码授权(Authorization Code Grant)实现的正如 OAuth 2.0 Authorization Framework 和 OpenID Connect Core 1.0中指定的那样。 本节摘要 Core ConfigurationAdvanced ConfigurationOIDC Logout Core Configuration Spring Boot Sample Spring Boot 为 OAuth 2.0 Login 带来了完整的自动配置功能。 本节展示如何使用 Google 作为身份验证提供者来配置 OAuth 2.0 Login 示例并涵盖以下主题: Initial SetupSetting the Redirect URIConfigure application.ymlBoot up the Application Initial Setup 要使用 Google 的 OAuth 2.0身份验证系统进行登录必须在 Google API Console 中设置一个项目以获得 OAuth 2.0凭据。 Google 用于身份验证的 OAuth 2.0实现符合 OpenID Connect 1.0规范并通过了 OpenID 认证。 按照 OpenID Connect 页面上的说明进行操作从“设置 OAuth 2.0”部分开始。 在完成“获取 OAuth 2.0凭据”说明之后您应该拥有新的 OAuth Client其凭据包括客户端 ID 和客户端秘钥。 Setting the Redirect URI 重定向 URI 是应用程序中的路径最终用户的用户代理在通过 Google 身份验证并授予对 Consent 页面上的 OAuth Client (在前一步中创建)的访问权限之后将重定向回该路径。 在“ Set a redirect URI”小节中确保 Authorized redirect URI 字段设置为 localhost: 8080/login/oauth2/code/google。 默认的重定向 URI 模板是{ baseUrl }/login/oauth2/code/{ registrationId }。 registrationId 是 ClientRegistry 的唯一标识符。 如果 OAuth 客户端运行在代理服务器之后您应该检查代理服务器配置以确保应用程序配置正确。另外请参阅 redirect-URI 支持的 URI 模板变量。 Configure application.yml 现在您已经有了一个新的 OAuth Client 和 Google您需要将应用程序配置为使用 OAuth Client 进行身份验证流。这样做: 转到 application.yml 并设置以下配置: spring:security:oauth2:client:registration: google: client-id: google-client-idclient-secret: google-client-secretOAuth Client properties spring.security.oauth2.client.registration 是 OAuth Client 属性的基本属性前缀。在基本属性前缀之后是 ClientRegistration的 ID例如 Google。 用前面创建的 OAuth 2.0凭据替换 client-id 和 client-secret 属性中的值。 Boot up the Application 启动 Spring Boot 示例并转到 localhost: 8080。然后重定向到默认的自动生成登录页面该页面显示 Google 的链接。 点击 Google 链接然后你会被重定向到 Google 进行身份验证。 在使用您的 Google 帐户凭据进行身份验证之后您将看到“同意”屏幕。Consent 屏幕要求您允许或拒绝访问先前创建的 OAuth Client。单击“允许”授权 OAuth 客户端访问您的电子邮件地址和基本配置文件信息。 此时OAuth 客户机将从 UserInfo 端点检索您的电子邮件地址和基本配置文件信息并建立一个经过身份验证的会话。 Spring Boot Property Mappings 下表概述了 SpringBootOAuthClient 属性到 ClientRegistry 属性的映射。 Spring BootClientRegistrationspring.security.oauth2.client.registration.*[registrationId]*registrationIdspring.security.oauth2.client.registration.*[registrationId]*.client-idclientIdspring.security.oauth2.client.registration.*[registrationId]*.client-secretclientSecretspring.security.oauth2.client.registration.*[registrationId]*.client-authentication-methodclientAuthenticationMethodspring.security.oauth2.client.registration.*[registrationId]*.authorization-grant-typeauthorizationGrantTypespring.security.oauth2.client.registration.*[registrationId]*.redirect-uriredirectUrispring.security.oauth2.client.registration.*[registrationId]*.scopescopesspring.security.oauth2.client.registration.*[registrationId]*.client-nameclientNamespring.security.oauth2.client.provider.*[providerId]*.authorization-uriproviderDetails.authorizationUrispring.security.oauth2.client.provider.*[providerId]*.token-uriproviderDetails.tokenUrispring.security.oauth2.client.provider.*[providerId]*.jwk-set-uriproviderDetails.jwkSetUrispring.security.oauth2.client.provider.*[providerId]*.issuer-uriproviderDetails.issuerUrispring.security.oauth2.client.provider.*[providerId]*.user-info-uriproviderDetails.userInfoEndpoint.urispring.security.oauth2.client.provider.*[providerId]*.user-info-authentication-methodproviderDetails.userInfoEndpoint.authenticationMethodspring.security.oauth2.client.provider.*[providerId]*.user-name-attributeproviderDetails.userInfoEndpoint.userNameAttributeName 通过指定 spring.security.oauth2.client.Provider可以通过发现 OpenID Connect Provider 的 Configuration 端点或 Authorization Server 的 Metadata 端点来最初配置 spring.security.oauth2.client.provider.[providerId].issuer-uri属性。 CommonOAuth2Provider CommonOAuth2Provider 为许多知名的提供商(Google、 gitHub、 Facebook 和 Okta)预先定义了一组默认客户端属性。 例如对于提供程序authority-uri、 token-uri 和 user-info-uri 不会经常更改。因此提供默认值以减少所需的配置是有意义的。 如前所述当我们配置 Google 客户机时只需要client-id 和client-secret属性。 下面的清单显示了一个示例: spring:security:oauth2:client:registration:google:client-id: google-client-idclient-secret: google-client-secret在这里客户端属性的自动默认无缝工作因为 registrationId (GOOGLE)匹配 CommonOAuth2Provider 中的 GOOGLE 枚举(不区分大小写)。 对于希望指定不同的 registrationId (如 google-login)的情况您仍然可以通过配置 Provider 属性来利用客户端属性的自动默认。 spring:security:oauth2:client:registration:google-login: provider: google client-id: google-client-idclient-secret: google-client-secretRegistrationId 被设置为 google-login。Provider 属性设置为 google它将利用 CommonOAuth2Provider.GOOGLE.getBuilder ()中设置的客户端属性的自动默认。 Configuring Custom Provider Properties 有一些 OAuth 2.0提供程序支持多租户这导致每个租户(或子域)有不同的协议端点。 例如一个在 Okta 注册的 OAuth 客户端被分配到一个特定的子域并且拥有自己的协议端点。 对于这些情况Spring Boot 为配置自定义提供程序属性提供了以下基本属性: spring.security.oauth2.client.provider.*[providerId]*. 下面的清单显示了一个示例: spring:security:oauth2:client:registration:okta:client-id: okta-client-idclient-secret: okta-client-secretprovider:okta: authorization-uri: https://your-subdomain.oktapreview.com/oauth2/v1/authorizetoken-uri: https://your-subdomain.oktapreview.com/oauth2/v1/tokenuser-info-uri: https://your-subdomain.oktapreview.com/oauth2/v1/userinfouser-name-attribute: subjwk-set-uri: https://your-subdomain.oktapreview.com/oauth2/v1/keys基本属性(spring.security.oauth2.client.provision. okta)允许对协议端点位置进行自定义配置。 Overriding Spring Boot Auto-configuration OAuth 客户端支持的 Spring 引导自动配置类是 OAuth2ClientAutoConfiguration。 它执行下列任务: 从配置的 OAuth Client 属性注册一个由 ClientRegistration组成的 ClientRegistrationRepositoryBean。注册一个 SecurityFilterChainBean 并通过 httpSecurity.oauth2Login()启用 OAuth 2.0登录。 如果您需要根据您的具体要求覆盖自动配置您可以通过以下方式进行: Register a ClientRegistrationRepository BeanRegister a SecurityFilterChain BeanCompletely Override the Auto-configuration Register a ClientRegistrationRepository Bean 下面的示例演示如何注册 ClientRegistrationRepositoryBean: Configuration public class OAuth2LoginConfig {Beanpublic ClientRegistrationRepository clientRegistrationRepository() {return new InMemoryClientRegistrationRepository(this.googleClientRegistration());}private ClientRegistration googleClientRegistration() {return ClientRegistration.withRegistrationId(google).clientId(google-client-id).clientSecret(google-client-secret).clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC).authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE).redirectUri({baseUrl}/login/oauth2/code/{registrationId}).scope(openid, profile, email, address, phone).authorizationUri(https://accounts.google.com/o/oauth2/v2/auth).tokenUri(https://www.googleapis.com/oauth2/v4/token).userInfoUri(https://www.googleapis.com/oauth2/v3/userinfo).userNameAttributeName(IdTokenClaimNames.SUB).jwkSetUri(https://www.googleapis.com/oauth2/v3/certs).clientName(Google).build();} }Register a SecurityFilterChain Bean 下面的示例演示如何用EnableWebSecurity 注册 SecurityFilterChainBean 并通过 httpSecurity.oauth2Login()启用 OAuth2.0登录: OAuth2 Login Configuration Configuration EnableWebSecurity public class OAuth2LoginSecurityConfig {Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize - authorize.anyRequest().authenticated()).oauth2Login(withDefaults());return http.build();} }Completely Override the Auto-configuration 下面的示例显示如何通过注册 ClientRegistrationRepositoryBean 和 SecurityFilterChainBean 来完全覆盖自动配置。 Overriding the auto-configuration Configuration public class OAuth2LoginConfig {Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize - authorize.anyRequest().authenticated()).oauth2Login(withDefaults());return http.build();}Beanpublic ClientRegistrationRepository clientRegistrationRepository() {return new InMemoryClientRegistrationRepository(this.googleClientRegistration());}private ClientRegistration googleClientRegistration() {return ClientRegistration.withRegistrationId(google).clientId(google-client-id).clientSecret(google-client-secret).clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC).authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE).redirectUri({baseUrl}/login/oauth2/code/{registrationId}).scope(openid, profile, email, address, phone).authorizationUri(https://accounts.google.com/o/oauth2/v2/auth).tokenUri(https://www.googleapis.com/oauth2/v4/token).userInfoUri(https://www.googleapis.com/oauth2/v3/userinfo).userNameAttributeName(IdTokenClaimNames.SUB).jwkSetUri(https://www.googleapis.com/oauth2/v3/certs).clientName(Google).build();} }Java Configuration without Spring Boot 如果您不能使用 Spring Boot并且希望在 CommonOAuth2Provider (例如Google)中配置一个预定义的提供程序请应用以下配置: Configuration EnableWebSecurity public class OAuth2LoginConfig {Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize - authorize.anyRequest().authenticated()).oauth2Login(withDefaults());return http.build();}Beanpublic ClientRegistrationRepository clientRegistrationRepository() {return new InMemoryClientRegistrationRepository(this.googleClientRegistration());}Beanpublic OAuth2AuthorizedClientService authorizedClientService(ClientRegistrationRepository clientRegistrationRepository) {return new InMemoryOAuth2AuthorizedClientService(clientRegistrationRepository);}Beanpublic OAuth2AuthorizedClientRepository authorizedClientRepository(OAuth2AuthorizedClientService authorizedClientService) {return new AuthenticatedPrincipalOAuth2AuthorizedClientRepository(authorizedClientService);}private ClientRegistration googleClientRegistration() {return CommonOAuth2Provider.GOOGLE.getBuilder(google).clientId(google-client-id).clientSecret(google-client-secret).build();} }Advanced Configuration Oauth2Login ()提供了许多用于定制 OAuth 2.0 Login 的配置选项。主要的配置选项被分组到它们的协议端点对应项中。 例如oauth2Login().authorizationEndpoint()允许配置 AuthorizationEndpoint而 oauth2Login().tokenEndpoint()允许配置令牌端点。 下面的代码显示了一个示例: Advanced OAuth2 Login Configuration Configuration EnableWebSecurity public class OAuth2LoginSecurityConfig {Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.oauth2Login(oauth2 - oauth2.authorizationEndpoint(authorization - authorization...).redirectionEndpoint(redirection - redirection...).tokenEndpoint(token - token...).userInfoEndpoint(userInfo - userInfo...));return http.build();} }Oauth2Login() DSL 的主要目标是紧密地与规范中定义的命名保持一致。 OAuth 2.0授权框架将协议端点定义如下: 授权过程使用两个授权服务器端点(HTTP 资源) : 授权端点: 客户端通过用户-代理重定向从资源所有者获得授权。令牌端点(Token Endpoint) : 客户端用来交换访问令牌的授权许可通常使用客户端身份验证。 授权过程还使用一个客户端端点: 重定向端点: 授权服务器通过资源所有者用户代理向客户端返回包含授权凭据的响应。 OpenID Connect Core 1.0规范将 UserInfo 端点定义如下: UserInfo 端点是一个 OAuth 2.0 Protected Resource它返回关于经过身份验证的最终用户的声明。为了获得关于最终用户的请求声明客户机使用通过 OpenID Connect Authentication 获得的访问令牌向 UserInfo 端点发出请求。这些声明通常由一个 JSON 对象表示该对象包含声明的名称-值对的集合。 下面的代码显示了 oauth2Login() DSL 可用的完整配置选项: OAuth2 Login Configuration Options Configuration EnableWebSecurity public class OAuth2LoginSecurityConfig {Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.oauth2Login(oauth2 - oauth2.clientRegistrationRepository(this.clientRegistrationRepository()).authorizedClientRepository(this.authorizedClientRepository()).authorizedClientService(this.authorizedClientService()).loginPage(/login).authorizationEndpoint(authorization - authorization.baseUri(this.authorizationRequestBaseUri()).authorizationRequestRepository(this.authorizationRequestRepository()).authorizationRequestResolver(this.authorizationRequestResolver())).redirectionEndpoint(redirection - redirection.baseUri(this.authorizationResponseBaseUri())).tokenEndpoint(token - token.accessTokenResponseClient(this.accessTokenResponseClient())).userInfoEndpoint(userInfo - userInfo.userAuthoritiesMapper(this.userAuthoritiesMapper()).userService(this.oauth2UserService()).oidcUserService(this.oidcUserService())));return http.build();} }除了 oauth2Login() DSL 之外还支持 XML 配置。 下面的代码显示了security namespace中可用的完整配置选项: OAuth2 Login XML Configuration Options httpoauth2-login client-registration-repository-refclientRegistrationRepositoryauthorized-client-repository-refauthorizedClientRepositoryauthorized-client-service-refauthorizedClientServiceauthorization-request-repository-refauthorizationRequestRepositoryauthorization-request-resolver-refauthorizationRequestResolveraccess-token-response-client-refaccessTokenResponseClientuser-authorities-mapper-refuserAuthoritiesMapperuser-service-refoauth2UserServiceoidc-user-service-refoidcUserServicelogin-processing-url/login/oauth2/code/*login-page/loginauthentication-success-handler-refauthenticationSuccessHandlerauthentication-failure-handler-refauthenticationFailureHandlerjwt-decoder-factory-refjwtDecoderFactory/ /http以下各节将详细介绍每个可用配置选项: OAuth 2.0 Login PageRedirection EndpointUserInfo EndpointID Token Signature Verification[oauth2login-advanced-oidc-logout] OAuth 2.0 Login Page 默认情况下OAuth 2.0登录页面是由 DefaultLoginPageGeneratingFilter 自动生成的。默认登录页面显示每个配置的 OAuth Client 及其 ClientRegistration.clientName 作为链接该链接能够初始化授权请求(或 OAuth 2.0 Login)。 为了使 DefaultLoginPageGeneratingFilter 显示已配置 OAuth 客户端的链接已注册的 ClientRegistrationRepository 还需要实现 Iterable ClientRegistry 。有关参考资料请参见 InmemyClientRegistrationRepository。 每个 OAuth 客户端的链接目标默认如下: OAuth2AuthorizationRequestRedirectFilter.DEFAULT_AUTHORIZATION_REQUEST_BASE_URI /{registrationId} 下面一行显示了一个示例: a href/oauth2/authorization/googleGoogle/a要覆盖默认登录页面请配置 oauth2Login().loginPage()和(可选) oauth2Login().authorizationEndpoint().baseUri()。 下面的清单显示了一个示例: OAuth2 Login Page Configuration Configuration EnableWebSecurity public class OAuth2LoginSecurityConfig {Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.oauth2Login(oauth2 - oauth2.loginPage(/login/oauth2)....authorizationEndpoint(authorization - authorization.baseUri(/login/oauth2/authorization)...));return http.build();} }您需要为Controller 提供一个RequestMapping (“/login/oauth2”) 该映射能够呈现自定义登录页面。 如前所述配置 oauth2Login().authorizationEndpoint().baseUri()是可选的。但是如果您选择自定义它请确保到每个 OAuth Client 的链接与 authorizationEndpoint().baseUri().匹配. 下面一行显示了一个示例: a href/login/oauth2/authorization/googleGoogle/aRedirection Endpoint 授权服务器使用重定向端点通过资源所有者用户代理向客户端返回授权响应(其中包含授权凭据)。 OAuth 2.0 Login 利用了授权代码授权。 默认的 Authorization Response baseUri (重定向端点)是/login/oauth2/code/* 它在 OAuth2LoginAuthenticationFilter.DEFAULT_FILTER_PROCESSES_URI中定义。 如果希望自定义 Authorization Response baseUri请按以下方式配置它: Configuration EnableWebSecurity public class OAuth2LoginSecurityConfig {Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.oauth2Login(oauth2 - oauth2.redirectionEndpoint(redirection - redirection.baseUri(/login/oauth2/callback/*)...));return http.build();} }您还需要确保 ClientRegistration.redirectUri 与自定义 Authorization Response baseUri 匹配。 下面的清单显示了一个示例: return CommonOAuth2Provider.GOOGLE.getBuilder(google).clientId(google-client-id).clientSecret(google-client-secret).redirectUri({baseUrl}/login/oauth2/callback/{registrationId}).build();UserInfo Endpoint UserInfo 端点包括许多配置选项如下面小节所述: Mapping User AuthoritiesOAuth 2.0 UserServiceOpenID Connect 1.0 UserService Mapping User Authorities 在用户成功地通过 OAuth 2.0提供程序进行身份验证之后OAuth2User.getAuthority()(或 OidcUser.getAuthority())包含一个由 OAuth2UserRequest.getAccessToken()填充的授权列表。GetScope()并以 SCOPE_作为前缀。这些授予的权限可以映射到一组新的 GrantedAuthority 实例这些实例在完成身份验证时提供给 OAuth2AuthenticationToken。 GetAuthority()用于对请求进行授权例如 hasRole(‘USER’)或 hasRole (‘ ADMIN’)。 在映射用户权限时有两个选项可供选择: Using a GrantedAuthoritiesMapperDelegation-based Strategy with OAuth2UserService Using a GrantedAuthoritiesMapper 授予 GrantedAuthoritiesMapper 一个授权列表其中包含 OAuth2UserAuthority 类型的特殊授权和授权字符串 OAUTH2_USER (或 OidcUserAuthority 和授权字符串 OIDC_USER)。 提供 GrantedAuthortiesMapper 的实现并配置它如下所示: Granted Authorities Mapper Configuration Configuration EnableWebSecurity public class OAuth2LoginSecurityConfig {Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.oauth2Login(oauth2 - oauth2.userInfoEndpoint(userInfo - userInfo.userAuthoritiesMapper(this.userAuthoritiesMapper())...));return http.build();}private GrantedAuthoritiesMapper userAuthoritiesMapper() {return (authorities) - {SetGrantedAuthority mappedAuthorities new HashSet();authorities.forEach(authority - {if (OidcUserAuthority.class.isInstance(authority)) {OidcUserAuthority oidcUserAuthority (OidcUserAuthority)authority;OidcIdToken idToken oidcUserAuthority.getIdToken();OidcUserInfo userInfo oidcUserAuthority.getUserInfo();// Map the claims found in idToken and/or userInfo// to one or more GrantedAuthoritys and add it to mappedAuthorities} else if (OAuth2UserAuthority.class.isInstance(authority)) {OAuth2UserAuthority oauth2UserAuthority (OAuth2UserAuthority)authority;MapString, Object userAttributes oauth2UserAuthority.getAttributes();// Map the attributes found in userAttributes// to one or more GrantedAuthoritys and add it to mappedAuthorities}});return mappedAuthorities;};} }或者您可以注册一个 GrantedAuthortiesMapperBean让它自动应用到配置中如下所示: Granted Authorities Mapper Bean Configuration Configuration EnableWebSecurity public class OAuth2LoginSecurityConfig {Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.oauth2Login(withDefaults());return http.build();}Beanpublic GrantedAuthoritiesMapper userAuthoritiesMapper() {...} }Delegation-based Strategy with OAuth2UserService 与使用 GrantedAuthortiesMapper 相比此策略更先进。但是它也更加灵活因为它允许您访问 OAuth2UserRequest 和 OAuth2User (当使用 OAuth 2.0 UserService 时)或 OidcUserRequest 和 OidcUser (当使用 OpenID Connect 1.0 UserService 时)。 OAuth2UserRequest (和 OidcUserRequest)提供了对相关 OAuth2AccessToken 的访问在委托方需要从受保护的资源获取授权信息才能为用户映射自定义权限的情况下这非常有用。 下面的示例演示如何使用 OpenID Connect 1.0 UserService 实现和配置基于委托的策略: Configuration EnableWebSecurity public class OAuth2LoginSecurityConfig {Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.oauth2Login(oauth2 - oauth2.userInfoEndpoint(userInfo - userInfo.oidcUserService(this.oidcUserService())...));return http.build();}private OAuth2UserServiceOidcUserRequest, OidcUser oidcUserService() {final OidcUserService delegate new OidcUserService();return (userRequest) - {// Delegate to the default implementation for loading a userOidcUser oidcUser delegate.loadUser(userRequest);OAuth2AccessToken accessToken userRequest.getAccessToken();SetGrantedAuthority mappedAuthorities new HashSet();// TODO// 1) Fetch the authority information from the protected resource using accessToken// 2) Map the authority information to one or more GrantedAuthoritys and add it to mappedAuthorities// 3) Create a copy of oidcUser but use the mappedAuthorities insteadProviderDetails providerDetails userRequest.getClientRegistration().getProviderDetails();String userNameAttributeName providerDetails.getUserInfoEndpoint().getUserNameAttributeName();if (StringUtils.hasText(userNameAttributeName)) {oidcUser new DefaultOidcUser(mappedAuthorities, oidcUser.getIdToken(), oidcUser.getUserInfo(), userNameAttributeName);} else {oidcUser new DefaultOidcUser(mappedAuthorities, oidcUser.getIdToken(), oidcUser.getUserInfo());}return oidcUser;};} }OAuth 2.0 UserService DefaultOAuth2UserService 是支持标准 OAuth 2.0提供程序的 OAuth2UserService 的实现。 OAuth2UserService 从 UserInfo 端点(通过在授权流中使用授予客户端的访问令牌)获取终端用户(资源所有者)的用户属性并以 OAuthenticatedUser 的形式返回 AuthenticatedPrime。 DefaultOAuth2UserService 在 UserInfo 端点请求用户属性时使用 RestOperations 实例。 如果需要自定义 UserInfo 请求的预处理可以为 DefaultOAuth2UserService.setRequestEntityConverter ()提供自定义 Converter OAuth2UserRequestRequestEntity .默认实现 OAuth2UserRequestEntityConverter 构建 UserInfo 请求的 RequestEntity 表示形式该表示形式默认在 Authorization 头中设置 OAuth2AccessToken。 另一方面如果需要自定义 UserInfo Response 的后处理则需要为 DefaultOAuth2UserService.setRestOperations ()提供自定义配置的 RestOperations。默认的 RestOperations 配置如下: RestTemplate restTemplate new RestTemplate(); restTemplate.setErrorHandler(new OAuth2ErrorResponseErrorHandler());OAuth2ErrorResponseErrorHandler 是一个 ResponseErrorHandler可以处理 OAuth 2.0错误(400个错误请求)。它使用 OAuth2ErrorHttpMessageConverter 将 OAuth 2.0 Error 参数转换为 OAuth2Error。 无论您是自定义 DefaultOAuth2UserService 还是提供自己的 OAuth2UserService 实现都需要按以下方式配置它: Configuration EnableWebSecurity public class OAuth2LoginSecurityConfig {Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.oauth2Login(oauth2 - oauth2.userInfoEndpoint(userInfo - userInfo.userService(this.oauth2UserService())...));return http.build();}private OAuth2UserServiceOAuth2UserRequest, OAuth2User oauth2UserService() {...} }OpenID Connect 1.0 UserService OidcUserService 是支持 OpenID Connect 1.0 Provider 的 OAuth2UserService 的实现。 OidcUserService 在 UserInfo 端点请求用户属性时利用 DefaultOAuth2UserService。 如果需要自定义 UserInfo 请求的预处理或 UserInfo 响应的后处理则需要为 OidcUserService.setOauth2UserService ()提供自定义配置的 DefaultOAuth2UserService。 无论您是自定义 OidcUserService还是为 OpenID Connect 1.0 Provider 提供自己的 OAuth2UserService 实现都需要将其配置如下: Configuration EnableWebSecurity public class OAuth2LoginSecurityConfig {Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.oauth2Login(oauth2 - oauth2.userInfoEndpoint(userInfo - userInfo.oidcUserService(this.oidcUserService())...));return http.build();}private OAuth2UserServiceOidcUserRequest, OidcUser oidcUserService() {...} }ID Token Signature Verification OpenID Connect 1.0 Authentication 引入了 ID 令牌这是一种安全令牌包含授权服务器在客户端使用时对最终用户身份验证的声明。 ID 令牌表示为 JSON Web 令牌(JWT) 必须使用 JSON Web 签名(JWS)进行签名。 OidcIdTokenDecoderFactory 提供用于 OidcIdToken 签名验证的 JwtDecder。默认算法是 RS256但在客户端注册期间分配时可能会有所不同。对于这些情况您可以配置解析器来返回为特定客户机分配的预期 JWS 算法。 JWS 算法解析器是一个函数它接受 ClientRegistry 并为客户机返回预期的 Jws松弛算法例如 SignatureAlobacm.RS256或 MacAlobacm.HS256 下面的代码显示了如何为所有 ClientRegistry 实例配置 OidcIdTokenDecoderFactoryBean使其默认为 MacAlobacm.HS256: Bean public JwtDecoderFactoryClientRegistration idTokenDecoderFactory() {OidcIdTokenDecoderFactory idTokenDecoderFactory new OidcIdTokenDecoderFactory();idTokenDecoderFactory.setJwsAlgorithmResolver(clientRegistration - MacAlgorithm.HS256);return idTokenDecoderFactory; }对于基于 MAC 的算法(如 HS256、 HS384或 HS512) 对应于客户机 ID 的客户机机密被用作签名验证的对称密钥。 如果为 OpenID Connect 1.0 Authentication 配置了多个 ClientRegistry则 JWS 算法解析器可以评估所提供的 ClientRegistry以确定返回哪个算法。 然后您可以继续配置注销 OIDC Logout 一旦终端用户能够登录到您的应用程序考虑他们将如何登出就很重要了。 一般来说有三种用例供您考虑: 我只想执行本地注销我想注销我的应用程序和由我的应用程序启动的 OIDC 提供程序想注销我的应用程序和由 OIDC 提供程序发起的 OIDC 提供程序 Local Logout 要执行本地注销不需要特殊的 OIDC 配置。SpringSecurity 会自动启动一个本地注销端点您可以通过 logout () DSL 对其进行配置。 OpenID Connect 1.0 Client-Initiated Logout OpenID Connect Session Management 1.0允许使用 Client 在提供者注销最终用户。其中一个可用的策略是 RP 启动注销。 如果 OpenID 提供程序同时支持会话管理和发现那么客户端可以从 OpenID 提供程序的 Discovery 元数据中获取 end_session_endpoint URL。您可以通过使用issuer-uri配置 ClientRegistry如下所示: spring:security:oauth2:client:registration:okta:client-id: okta-client-idclient-secret: okta-client-secret...provider:okta:issuer-uri: https://dev-1234.oktapreview.com此外您还应该配置实现 RP-Initiated Logout 的 OidcClientInitiatedLogoutSuccess Handler如下所示: Configuration EnableWebSecurity public class OAuth2LoginSecurityConfig {Autowiredprivate ClientRegistrationRepository clientRegistrationRepository;Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize - authorize.anyRequest().authenticated()).oauth2Login(withDefaults()).logout(logout - logout.logoutSuccessHandler(oidcLogoutSuccessHandler()));return http.build();}private LogoutSuccessHandler oidcLogoutSuccessHandler() {OidcClientInitiatedLogoutSuccessHandler oidcLogoutSuccessHandler new OidcClientInitiatedLogoutSuccessHandler(this.clientRegistrationRepository);// Sets the location that the End-Users User Agent will be redirected to// after the logout has been performed at the ProvideroidcLogoutSuccessHandler.setPostLogoutRedirectUri({baseUrl});return oidcLogoutSuccessHandler;} }OidcClientInitiatedLogoutSuccess Handler 支持{ baseUrl }占位符。 OpenID Connect 1.0 Back-Channel Logout OpenID Connect Session Management 1.0允许提供者向客户端发出 API 调用从而在客户端注销最终用户。这被称为 OIDC 后台注销。 为了实现这一点您可以像下面这样设置 DSL 中的 Back-Channel Logout 端点: Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests((authorize) - authorize.anyRequest().authenticated()).oauth2Login(withDefaults()).oidcLogout((logout) - logout.backChannel(Customizer.withDefaults()));return http.build(); }然后您需要一种方法来监听 Spring Security 发布的事件以删除旧的 OidcSessionInformation 条目如下所示: Bean public HttpSessionEventPublisher sessionEventPublisher() {return new HttpSessionEventPublisher(); }这样如果调用 HttpSession # 无效那么会话也将从内存中删除。 这将支持端点/logout/connect/back-channel/{ registrationId } OIDC 提供程序可以请求该端点/logout/connect/back-channel/{ registrationId }使应用程序中最终用户的给定会话无效。 Back-Channel Logout Architecture 考虑标识符为 registrationId 的 ClientRegistry。 后台注销的总体流程如下: 在登录时Spring Security 在其 OidcSessionStrategy 实现中将 ID 令牌、 CSRF 令牌和提供程序会话 ID (如果有的话)与应用程序的会话 ID 相关联然后在注销时OIDC 提供程序对/Logout/connect/back-channel/registrationId 进行 API 调用包括一个注销令牌指示要注销的子(最终用户)或 sid (提供程序会话 ID)。SpringSecurity 验证令牌的签名和声明。如果令牌包含 sid 声明则只有与该提供程序会话相关联的客户端会话被终止。否则如果令牌包含子声明则终止该最终用户的所有客户端会话。 Customizing the OIDC Provider Session Strategy 默认情况下Spring Security 在内存中存储 OIDC 提供程序会话和客户端会话之间的所有链接。 在许多情况下比如集群应用程序最好将它存储在一个单独的位置比如数据库。 您可以通过配置自定义 OidcSessionStrategy 来实现这一点如下所示: Component public final class MySpringDataOidcSessionStrategy implements OidcSessionStrategy {private final OidcProviderSessionRepository sessions;// ...Overridepublic void saveSessionInformation(OidcSessionInformation info) {this.sessions.save(info);}Overridepublic OidcSessionInformation(String clientSessionId) {return this.sessions.removeByClientSessionId(clientSessionId);}Overridepublic IterableOidcSessionInformation removeSessionInformation(OidcLogoutToken token) {return token.getSessionId() ! null ?this.sessions.removeBySessionIdAndIssuerAndAudience(...) :this.sessions.removeBySubjectAndIssuerAndAudience(...);} }
http://www.zqtcl.cn/news/271858/

相关文章:

  • 网站开发什么叫前端后端seo研究中心晴天
  • 邢台建筑类的建设网站代刷网站只做软件下载
  • 关于旅游的网站建设目的食品网站建设的目的
  • 开发php网站开发太湖网站建设推荐秒搜科技
  • 90设计网站怎么绑定手机号淘宝搜索排名
  • 无锡自助做网站哪些编程语言适合网站开发
  • 蒲城网站建设wzjseo北京专业推广公司
  • 阳春做网站外贸建站推广公司
  • 哪个网站的课件做的好源码之家关闭了
  • 各大网站热搜榜排名嵊州网站
  • 在哪找做网站的镇江网页设计工作室
  • 做网站的是干嘛的百度推广的几种方式
  • 临沧网站建设用eclipse做jsp网站
  • 做物流运输网站电话做网站看
  • 山东公司网站推广优化什么网站做宣传好
  • 企业网站模板设计外网vp(永久免费)加速器下载
  • 消费者联盟网站怎么做中山网站建设案例
  • 郑州市多商家网站制作公司网站建设要学多少课程
  • 现在网站开发模式淄博网站建设设计公司
  • 瑶海合肥网站建设东莞网站优化多少钱
  • pc蛋蛋游戏体验网站建设大型门户网站建设效果好吗
  • 昆明网站建设制作汽车之家官网网页版入口
  • 诸城建设局网站免费的创建个人网站
  • 网站建设工作下步打算上海搬家公司电话查询
  • 如何将自己做的网站推广出去大型网站方案
  • 深圳做网站排名哪家好贵阳景观设计公司
  • 做图片网站中英网站搭建报价表
  • 酒类网站该怎么做网站建设协议
  • 怎么打帮人 做网站开发的广告双语言网站模版
  • 企业网站建设的实验报告广告公司网站建设方案