|
@@ -384,541 +384,10 @@ If not configured a status code 200 will be returned by default.
|
|
|
- Documentation for the <<nsa-logout, logout element>> in the Spring Security XML Namespace section
|
|
|
|
|
|
|
|
|
-[[jc-oauth2login]]
|
|
|
-== OAuth 2.0 Login
|
|
|
+include::oauth2-client.adoc[]
|
|
|
|
|
|
-The OAuth 2.0 Login feature provides an application with the capability to have users log in to the application by using their existing account at an OAuth 2.0 Provider (e.g.
|
|
|
-GitHub) or OpenID Connect 1.0 Provider (such as Google).
|
|
|
-OAuth 2.0 Login implements the use cases: "Login with Google" or "Login with GitHub".
|
|
|
+include::oauth2-login.adoc[]
|
|
|
|
|
|
-NOTE: OAuth 2.0 Login is implemented by using the *Authorization Code Grant*, as specified in the https://tools.ietf.org/html/rfc6749#section-4.1[OAuth 2.0 Authorization Framework] and http://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth[OpenID Connect Core 1.0].
|
|
|
-
|
|
|
-[[jc-oauth2login-sample-boot]]
|
|
|
-=== Spring Boot 2.0 Sample
|
|
|
-
|
|
|
-Spring Boot 2.0 brings full auto-configuration capabilities for OAuth 2.0 Login.
|
|
|
-
|
|
|
-This section shows how to configure the {gh-samples-url}/boot/oauth2login[*OAuth 2.0 Login sample*] using _Google_ as the _Authentication Provider_ and covers the following topics:
|
|
|
-
|
|
|
-* <<jc-oauth2login-sample-initial-setup,Initial setup>>
|
|
|
-* <<jc-oauth2login-sample-redirect-uri,Setting the redirect URI>>
|
|
|
-* <<jc-oauth2login-sample-application-config,Configure `application.yml`>>
|
|
|
-* <<jc-oauth2login-sample-boot-application,Boot up the application>>
|
|
|
-
|
|
|
-
|
|
|
-[[jc-oauth2login-sample-initial-setup]]
|
|
|
-==== Initial setup
|
|
|
-
|
|
|
-To use Google's OAuth 2.0 authentication system for login, you must set up a project in the Google API Console to obtain OAuth 2.0 credentials.
|
|
|
-
|
|
|
-NOTE: https://developers.google.com/identity/protocols/OpenIDConnect[Google's OAuth 2.0 implementation] for authentication conforms to the http://openid.net/connect/[OpenID Connect 1.0] specification and is http://openid.net/certification/[OpenID Certified].
|
|
|
-
|
|
|
-Follow the instructions on the https://developers.google.com/identity/protocols/OpenIDConnect[OpenID Connect] page, starting in the section, "Setting up OAuth 2.0".
|
|
|
-
|
|
|
-After completing the "Obtain OAuth 2.0 credentials" instructions, you should have a new OAuth Client with credentials consisting of a Client ID and a Client Secret.
|
|
|
-
|
|
|
-[[jc-oauth2login-sample-redirect-uri]]
|
|
|
-==== Setting the redirect URI
|
|
|
-
|
|
|
-The redirect URI is the path in the application that the end-user's user-agent is redirected back to after they have authenticated with Google and have granted access to the OAuth Client _(<<jc-oauth2login-sample-initial-setup,created in the previous step>>)_ on the Consent page.
|
|
|
-
|
|
|
-In the "Set a redirect URI" sub-section, ensure that the *Authorized redirect URIs* field is set to `http://localhost:8080/login/oauth2/code/google`.
|
|
|
-
|
|
|
-TIP: The default redirect URI template is `{baseUrl}/login/oauth2/code/{registrationId}`.
|
|
|
-The *_registrationId_* is a unique identifier for the <<jc-oauth2login-client-registration,ClientRegistration>>.
|
|
|
-
|
|
|
-[[jc-oauth2login-sample-application-config]]
|
|
|
-==== Configure `application.yml`
|
|
|
-
|
|
|
-Now that you have a new OAuth Client with Google, you need to configure the application to use the OAuth Client for the _authentication flow_.
|
|
|
-To do so:
|
|
|
-
|
|
|
-. Go to `application.yml` and set the following configuration:
|
|
|
-+
|
|
|
-[source,yaml]
|
|
|
-----
|
|
|
-spring:
|
|
|
- security:
|
|
|
- oauth2:
|
|
|
- client:
|
|
|
- registration: <1>
|
|
|
- google: <2>
|
|
|
- client-id: google-client-id
|
|
|
- client-secret: google-client-secret
|
|
|
-----
|
|
|
-+
|
|
|
-.OAuth Client properties
|
|
|
-====
|
|
|
-<1> `spring.security.oauth2.client.registration` is the base property prefix for OAuth Client properties.
|
|
|
-<2> Following the base property prefix is the ID for the <<jc-oauth2login-client-registration,ClientRegistration>>, such as google.
|
|
|
-====
|
|
|
-
|
|
|
-. Replace the values in the `client-id` and `client-secret` property with the OAuth 2.0 credentials you created earlier.
|
|
|
-
|
|
|
-
|
|
|
-[[jc-oauth2login-sample-boot-application]]
|
|
|
-==== Boot up the application
|
|
|
-
|
|
|
-Launch the Spring Boot 2.0 sample and go to `http://localhost:8080`.
|
|
|
-You are then redirected to the default _auto-generated_ login page, which displays a link for Google.
|
|
|
-
|
|
|
-Click on the Google link, and you are then redirected to Google for authentication.
|
|
|
-
|
|
|
-After authenticating with your Google account credentials, the next page presented to you is the Consent screen.
|
|
|
-The Consent screen asks you to either allow or deny access to the OAuth Client you created earlier.
|
|
|
-Click *Allow* to authorize the OAuth Client to access your email address and basic profile information.
|
|
|
-
|
|
|
-At this point, the OAuth Client retrieves your email address and basic profile information from the http://openid.net/specs/openid-connect-core-1_0.html#UserInfo[UserInfo Endpoint] and establishes an authenticated session.
|
|
|
-
|
|
|
-[[jc-oauth2login-client-registration]]
|
|
|
-=== ClientRegistration
|
|
|
-
|
|
|
-`ClientRegistration` is a representation of a client registered with an OAuth 2.0 or OpenID Connect 1.0 Provider.
|
|
|
-
|
|
|
-A client registration holds information, such as client id, client secret,
|
|
|
-authorization grant type, redirect URI, scope(s), authorization URI, token URI, and other details.
|
|
|
-
|
|
|
-`ClientRegistration` and its properties are defined as follows:
|
|
|
-
|
|
|
-[source,java]
|
|
|
-----
|
|
|
-public final class ClientRegistration {
|
|
|
- private String registrationId; <1>
|
|
|
- private String clientId; <2>
|
|
|
- private String clientSecret; <3>
|
|
|
- private ClientAuthenticationMethod clientAuthenticationMethod; <4>
|
|
|
- private AuthorizationGrantType authorizationGrantType; <5>
|
|
|
- private String redirectUriTemplate; <6>
|
|
|
- private Set<String> scopes; <7>
|
|
|
- private ProviderDetails providerDetails;
|
|
|
- private String clientName; <8>
|
|
|
-
|
|
|
- public class ProviderDetails {
|
|
|
- private String authorizationUri; <9>
|
|
|
- private String tokenUri; <10>
|
|
|
- private UserInfoEndpoint userInfoEndpoint;
|
|
|
- private String jwkSetUri; <11>
|
|
|
-
|
|
|
- public class UserInfoEndpoint {
|
|
|
- private String uri; <12>
|
|
|
- private String userNameAttributeName; <13>
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-----
|
|
|
-<1> `registrationId`: The ID that uniquely identifies the `ClientRegistration`.
|
|
|
-<2> `clientId`: The client identifier.
|
|
|
-<3> `clientSecret`: The client secret.
|
|
|
-<4> `clientAuthenticationMethod`: The method used to authenticate the Client with the Provider.
|
|
|
-The supported values are *basic* and *post*.
|
|
|
-<5> `authorizationGrantType`: The OAuth 2.0 Authorization Framework defines four https://tools.ietf.org/html/rfc6749#section-1.3[Authorization Grant] types.
|
|
|
- The supported values are authorization_code and implicit.
|
|
|
-<6> `redirectUriTemplate`: The client's registered redirect URI that the _Authorization Server_ redirects the end-user's user-agent
|
|
|
- to after the end-user has authenticated and authorized access to the client.
|
|
|
- The default redirect URI template is `{baseUrl}/login/oauth2/code/{registrationId}`, which supports URI template variables.
|
|
|
-<7> `scopes`: The scope(s) requested by the client during the Authorization Request flow, such as openid, email, or profile.
|
|
|
-<8> `clientName`: A descriptive name used for the client.
|
|
|
-The name may be used in certain scenarios, such as when displaying the name of the client in the auto-generated login page.
|
|
|
-<9> `authorizationUri`: The Authorization Endpoint URI for the Authorization Server.
|
|
|
-<10> `tokenUri`: The Token Endpoint URI for the Authorization Server.
|
|
|
-<11> `jwkSetUri`: The URI used to retrieve the https://tools.ietf.org/html/rfc7517[JSON Web Key (JWK)] Set from the Authorization Server,
|
|
|
- which contains the cryptographic key(s) used to verify the https://tools.ietf.org/html/rfc7515[JSON Web Signature (JWS)] of the ID Token and optionally the UserInfo Response.
|
|
|
-<12> `(userInfoEndpoint)uri`: The UserInfo Endpoint URI used to access the claims/attributes of the authenticated end-user.
|
|
|
-<13> `userNameAttributeName`: The name of the attribute returned in the UserInfo Response that references the Name or Identifier of the end-user.
|
|
|
-
|
|
|
-[[jc-oauth2login-boot-property-mappings]]
|
|
|
-=== Spring Boot 2.0 Property Mappings
|
|
|
-
|
|
|
-The following table outlines the mapping of the Spring Boot 2.0 OAuth Client properties to the `ClientRegistration` properties.
|
|
|
-
|
|
|
-|===
|
|
|
-|Spring Boot 2.0 |ClientRegistration
|
|
|
-
|
|
|
-|`spring.security.oauth2.client.registration._[registrationId]_`
|
|
|
-|`registrationId`
|
|
|
-
|
|
|
-|`spring.security.oauth2.client.registration._[registrationId]_.client-id`
|
|
|
-|`clientId`
|
|
|
-
|
|
|
-|`spring.security.oauth2.client.registration._[registrationId]_.client-secret`
|
|
|
-|`clientSecret`
|
|
|
-
|
|
|
-|`spring.security.oauth2.client.registration._[registrationId]_.client-authentication-method`
|
|
|
-|`clientAuthenticationMethod`
|
|
|
-
|
|
|
-|`spring.security.oauth2.client.registration._[registrationId]_.authorization-grant-type`
|
|
|
-|`authorizationGrantType`
|
|
|
-
|
|
|
-|`spring.security.oauth2.client.registration._[registrationId]_.redirect-uri-template`
|
|
|
-|`redirectUriTemplate`
|
|
|
-
|
|
|
-|`spring.security.oauth2.client.registration._[registrationId]_.scope`
|
|
|
-|`scopes`
|
|
|
-
|
|
|
-|`spring.security.oauth2.client.registration._[registrationId]_.client-name`
|
|
|
-|`clientName`
|
|
|
-
|
|
|
-|`spring.security.oauth2.client.provider._[providerId]_.authorization-uri`
|
|
|
-|`providerDetails.authorizationUri`
|
|
|
-
|
|
|
-|`spring.security.oauth2.client.provider._[providerId]_.token-uri`
|
|
|
-|`providerDetails.tokenUri`
|
|
|
-
|
|
|
-|`spring.security.oauth2.client.provider._[providerId]_.jwk-set-uri`
|
|
|
-|`providerDetails.jwkSetUri`
|
|
|
-
|
|
|
-|`spring.security.oauth2.client.provider._[providerId]_.user-info-uri`
|
|
|
-|`providerDetails.userInfoEndpoint.uri`
|
|
|
-
|
|
|
-|`spring.security.oauth2.client.provider._[providerId]_.userNameAttribute`
|
|
|
-|`providerDetails.userInfoEndpoint.userNameAttributeName`
|
|
|
-|===
|
|
|
-
|
|
|
-[[jc-oauth2login-client-registration-repo]]
|
|
|
-=== ClientRegistrationRepository
|
|
|
-
|
|
|
-The `ClientRegistrationRepository` serves as a repository for OAuth 2.0 / OpenID Connect 1.0 `ClientRegistration`(s).
|
|
|
-
|
|
|
-[NOTE]
|
|
|
-Client registration information is ultimately stored and owned by the associated Authorization Server.
|
|
|
-This repository provides the ability to retrieve a sub-set of the primary client registration information,
|
|
|
-which is stored with the Authorization Server.
|
|
|
-
|
|
|
-Spring Boot 2.0 auto-configuration binds each of the properties under `spring.security.oauth2.client.registration._[registrationId]_`
|
|
|
-to an instance of `ClientRegistration` and then composes each of the `ClientRegistration` instance(s) within a `ClientRegistrationRepository`.
|
|
|
-
|
|
|
-[NOTE]
|
|
|
-The default implementation of `ClientRegistrationRepository` is `InMemoryClientRegistrationRepository`.
|
|
|
-
|
|
|
-The auto-configuration also registers the `ClientRegistrationRepository` as a `@Bean` in the `ApplicationContext`
|
|
|
-so that it is available for dependency-injection, if needed by the application.
|
|
|
-
|
|
|
-The following listing shows an example:
|
|
|
-
|
|
|
-[source,java]
|
|
|
-----
|
|
|
-@Controller
|
|
|
-public class OAuth2LoginController {
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private ClientRegistrationRepository clientRegistrationRepository;
|
|
|
-
|
|
|
- @RequestMapping("/")
|
|
|
- public String index() {
|
|
|
- ClientRegistration googleRegistration =
|
|
|
- this.clientRegistrationRepository.findByRegistrationId("google");
|
|
|
-
|
|
|
- ...
|
|
|
-
|
|
|
- return "index";
|
|
|
- }
|
|
|
-}
|
|
|
-----
|
|
|
-
|
|
|
-[[jc-oauth2login-common-oauth2-provider]]
|
|
|
-=== CommonOAuth2Provider
|
|
|
-
|
|
|
-`CommonOAuth2Provider` pre-defines a set of default client properties for a number of well known providers: Google, GitHub, Facebook, and Okta.
|
|
|
-
|
|
|
-For example, the `authorization-uri`, `token-uri`, and `user-info-uri` do not change often for a Provider.
|
|
|
-Therefore, it makes sense to provide default values in order to reduce the required configuration.
|
|
|
-
|
|
|
-As demonstrated previously, when we <<jc-oauth2login-sample-application-config,configured a Google client>>, only the `client-id` and `client-secret` properties are required.
|
|
|
-
|
|
|
-The following listing shows an example:
|
|
|
-
|
|
|
-[source,yaml]
|
|
|
-----
|
|
|
-spring:
|
|
|
- security:
|
|
|
- oauth2:
|
|
|
- client:
|
|
|
- registration:
|
|
|
- google:
|
|
|
- client-id: google-client-id
|
|
|
- client-secret: google-client-secret
|
|
|
-----
|
|
|
-
|
|
|
-[TIP]
|
|
|
-The auto-defaulting of client properties works seamlessly here because the `registrationId` (`google`) matches the `GOOGLE` `enum` (case-insensitive) in `CommonOAuth2Provider`.
|
|
|
-
|
|
|
-For cases where you may want to specify a different `registrationId`, such as `google-login`,
|
|
|
-you can still leverage auto-defaulting of client properties by configuring the `provider` property.
|
|
|
-
|
|
|
-The following listing shows an example:
|
|
|
-
|
|
|
-[source,yaml]
|
|
|
-----
|
|
|
-spring:
|
|
|
- security:
|
|
|
- oauth2:
|
|
|
- client:
|
|
|
- registration:
|
|
|
- google-login: <1>
|
|
|
- provider: google <2>
|
|
|
- client-id: google-client-id
|
|
|
- client-secret: google-client-secret
|
|
|
-----
|
|
|
-<1> The `registrationId` is set to `google-login`.
|
|
|
-<2> The `provider` property is set to `google`, which will leverage the auto-defaulting of client properties set in `CommonOAuth2Provider.GOOGLE.getBuilder()`.
|
|
|
-
|
|
|
-[[jc-oauth2login-custom-provider-properties]]
|
|
|
-=== Configuring Custom Provider Properties
|
|
|
-
|
|
|
-There are some OAuth 2.0 Providers that support multi-tenancy, which results in different protocol endpoints for each tenant (or sub-domain).
|
|
|
-
|
|
|
-For example, an OAuth Client registered with Okta is assigned to a specific sub-domain and have their own protocol endpoints.
|
|
|
-
|
|
|
-For these cases, Spring Boot 2.0 provides the following base property for configuring custom provider properties: `spring.security.oauth2.client.provider._[providerId]_`.
|
|
|
-
|
|
|
-The following listing shows an example:
|
|
|
-
|
|
|
-[source,yaml]
|
|
|
-----
|
|
|
-spring:
|
|
|
- security:
|
|
|
- oauth2:
|
|
|
- client:
|
|
|
- registration:
|
|
|
- okta:
|
|
|
- client-id: okta-client-id
|
|
|
- client-secret: okta-client-secret
|
|
|
- provider:
|
|
|
- okta: <1>
|
|
|
- authorization-uri: https://your-subdomain.oktapreview.com/oauth2/v1/authorize
|
|
|
- token-uri: https://your-subdomain.oktapreview.com/oauth2/v1/token
|
|
|
- user-info-uri: https://your-subdomain.oktapreview.com/oauth2/v1/userinfo
|
|
|
- user-name-attribute: sub
|
|
|
- jwk-set-uri: https://your-subdomain.oktapreview.com/oauth2/v1/keys
|
|
|
-----
|
|
|
-
|
|
|
-<1> The base property (`spring.security.oauth2.client.provider.okta`) allows for custom configuration of protocol endpoint locations.
|
|
|
-
|
|
|
-[[jc-oauth2login-override-boot-autoconfig]]
|
|
|
-=== Overriding Spring Boot 2.0 Auto-configuration
|
|
|
-
|
|
|
-The Spring Boot 2.0 Auto-configuration class for OAuth Client support is `OAuth2ClientAutoConfiguration`.
|
|
|
-
|
|
|
-It performs the following tasks:
|
|
|
-
|
|
|
-* Registers a `ClientRegistrationRepository` `@Bean` composed of `ClientRegistration`(s) from the configured OAuth Client properties.
|
|
|
-* Provides a `WebSecurityConfigurerAdapter` `@Configuration` and enables OAuth 2.0 Login through `httpSecurity.oauth2Login()`.
|
|
|
-
|
|
|
-If you need to override the auto-configuration based on your specific requirements, you may do so in the following ways:
|
|
|
-
|
|
|
-* <<jc-oauth2login-register-clientregistrationrepository-bean,Register a `ClientRegistrationRepository` `@Bean`>>
|
|
|
-* <<jc-oauth2login-provide-websecurityconfigureradapter,Provide a `WebSecurityConfigurerAdapter`>>
|
|
|
-* <<jc-oauth2login-completely-override-autoconfiguration,Completely Override the Auto-configuration>>
|
|
|
-
|
|
|
-
|
|
|
-[[jc-oauth2login-register-clientregistrationrepository-bean]]
|
|
|
-==== Register a `ClientRegistrationRepository` `@Bean`
|
|
|
-
|
|
|
-The following example shows how to register a `ClientRegistrationRepository` `@Bean`:
|
|
|
-
|
|
|
-[source,java]
|
|
|
-----
|
|
|
-@Configuration
|
|
|
-public class OAuth2LoginConfig {
|
|
|
-
|
|
|
- @Bean
|
|
|
- public ClientRegistrationRepository clientRegistrationRepository() {
|
|
|
- return new InMemoryClientRegistrationRepository(this.googleClientRegistration());
|
|
|
- }
|
|
|
-
|
|
|
- private ClientRegistration googleClientRegistration() {
|
|
|
- return ClientRegistration.withRegistrationId("google")
|
|
|
- .clientId("google-client-id")
|
|
|
- .clientSecret("google-client-secret")
|
|
|
- .clientAuthenticationMethod(ClientAuthenticationMethod.BASIC)
|
|
|
- .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
|
|
|
- .redirectUriTemplate("{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();
|
|
|
- }
|
|
|
-}
|
|
|
-----
|
|
|
-
|
|
|
-
|
|
|
-[[jc-oauth2login-provide-websecurityconfigureradapter]]
|
|
|
-==== Provide a `WebSecurityConfigurerAdapter`
|
|
|
-
|
|
|
-The following example shows how to provide a `WebSecurityConfigurerAdapter` with `@EnableWebSecurity` and enable OAuth 2.0 login through `httpSecurity.oauth2Login()`:
|
|
|
-
|
|
|
-[source,java]
|
|
|
-----
|
|
|
-@EnableWebSecurity
|
|
|
-public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {
|
|
|
-
|
|
|
- @Override
|
|
|
- protected void configure(HttpSecurity http) throws Exception {
|
|
|
- http
|
|
|
- .authorizeRequests()
|
|
|
- .anyRequest().authenticated()
|
|
|
- .and()
|
|
|
- .oauth2Login();
|
|
|
- }
|
|
|
-}
|
|
|
-----
|
|
|
-
|
|
|
-
|
|
|
-[[jc-oauth2login-completely-override-autoconfiguration]]
|
|
|
-==== Completely Override the Auto-configuration
|
|
|
-
|
|
|
-The following example shows how to completely override the auto-configuration by both registering a `ClientRegistrationRepository` `@Bean` and providing a `WebSecurityConfigurerAdapter`, both of which were described in the two preceding sections.
|
|
|
-
|
|
|
-[source,java]
|
|
|
-----
|
|
|
-@Configuration
|
|
|
-public class OAuth2LoginConfig {
|
|
|
-
|
|
|
- @EnableWebSecurity
|
|
|
- public static class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {
|
|
|
-
|
|
|
- @Override
|
|
|
- protected void configure(HttpSecurity http) throws Exception {
|
|
|
- http
|
|
|
- .authorizeRequests()
|
|
|
- .anyRequest().authenticated()
|
|
|
- .and()
|
|
|
- .oauth2Login();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- @Bean
|
|
|
- public ClientRegistrationRepository clientRegistrationRepository() {
|
|
|
- return new InMemoryClientRegistrationRepository(this.googleClientRegistration());
|
|
|
- }
|
|
|
-
|
|
|
- private ClientRegistration googleClientRegistration() {
|
|
|
- return ClientRegistration.withRegistrationId("google")
|
|
|
- .clientId("google-client-id")
|
|
|
- .clientSecret("google-client-secret")
|
|
|
- .clientAuthenticationMethod(ClientAuthenticationMethod.BASIC)
|
|
|
- .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
|
|
|
- .redirectUriTemplate("{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();
|
|
|
- }
|
|
|
-}
|
|
|
-----
|
|
|
-
|
|
|
-[[jc-oauth2login-javaconfig-wo-boot]]
|
|
|
-=== Java Configuration without Spring Boot 2.0
|
|
|
-
|
|
|
-If you are not able to use Spring Boot 2.0 and would like to configure one of the pre-defined providers in `CommonOAuth2Provider` (for example, Google), apply the following configuration:
|
|
|
-
|
|
|
-[source,java]
|
|
|
-----
|
|
|
-@Configuration
|
|
|
-public class OAuth2LoginConfig {
|
|
|
-
|
|
|
- @EnableWebSecurity
|
|
|
- public static class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {
|
|
|
-
|
|
|
- @Override
|
|
|
- protected void configure(HttpSecurity http) throws Exception {
|
|
|
- http
|
|
|
- .authorizeRequests()
|
|
|
- .anyRequest().authenticated()
|
|
|
- .and()
|
|
|
- .oauth2Login();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- @Bean
|
|
|
- public ClientRegistrationRepository clientRegistrationRepository() {
|
|
|
- return new InMemoryClientRegistrationRepository(this.googleClientRegistration());
|
|
|
- }
|
|
|
-
|
|
|
- @Bean
|
|
|
- public OAuth2AuthorizedClientService authorizedClientService() {
|
|
|
- return new InMemoryOAuth2AuthorizedClientService(this.clientRegistrationRepository());
|
|
|
- }
|
|
|
-
|
|
|
- private ClientRegistration googleClientRegistration() {
|
|
|
- return CommonOAuth2Provider.GOOGLE.getBuilder("google")
|
|
|
- .clientId("google-client-id")
|
|
|
- .clientSecret("google-client-secret")
|
|
|
- .build();
|
|
|
- }
|
|
|
-}
|
|
|
-----
|
|
|
-
|
|
|
-[[jc-oauth2login-authorized-client]]
|
|
|
-=== OAuth2AuthorizedClient / OAuth2AuthorizedClientService
|
|
|
-
|
|
|
-`OAuth2AuthorizedClient` is a representation of an Authorized Client.
|
|
|
-A client is considered to be authorized when the end-user (Resource Owner) has granted authorization to the client to access its protected resources.
|
|
|
-
|
|
|
-`OAuth2AuthorizedClient` serves the purpose of associating an `OAuth2AccessToken` to a `ClientRegistration` (client) and resource owner, who is the `Principal` end-user that granted the authorization.
|
|
|
-
|
|
|
-The primary role of the `OAuth2AuthorizedClientService` is to manage `OAuth2AuthorizedClient` instances.
|
|
|
-From a developer perspective, it provides the capability to lookup an `OAuth2AccessToken` associated with a client so that it may be used to initiate a request to a resource server.
|
|
|
-
|
|
|
-[NOTE]
|
|
|
-Spring Boot 2.0 Auto-configuration registers an `OAuth2AuthorizedClientService` `@Bean` in the `ApplicationContext`.
|
|
|
-
|
|
|
-The developer may also register an `OAuth2AuthorizedClientService` `@Bean` in the `ApplicationContext` (overriding Spring Boot 2.0 Auto-configuration) in order to have the ability to lookup an `OAuth2AccessToken` associated with a specific `ClientRegistration` (client).
|
|
|
-
|
|
|
-The following listing shows an example:
|
|
|
-
|
|
|
-[source,java]
|
|
|
-----
|
|
|
-@Controller
|
|
|
-public class OAuth2LoginController {
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private OAuth2AuthorizedClientService authorizedClientService;
|
|
|
-
|
|
|
- @RequestMapping("/userinfo")
|
|
|
- public String userinfo(OAuth2AuthenticationToken authentication) {
|
|
|
- // authentication.getAuthorizedClientRegistrationId() returns the
|
|
|
- // registrationId of the Client that was authorized during the Login flow
|
|
|
- OAuth2AuthorizedClient authorizedClient =
|
|
|
- this.authorizedClientService.loadAuthorizedClient(
|
|
|
- authentication.getAuthorizedClientRegistrationId(),
|
|
|
- authentication.getName());
|
|
|
-
|
|
|
- OAuth2AccessToken accessToken = authorizedClient.getAccessToken();
|
|
|
-
|
|
|
- ...
|
|
|
-
|
|
|
- return "userinfo";
|
|
|
- }
|
|
|
-}
|
|
|
-----
|
|
|
-
|
|
|
-
|
|
|
-[[jc-oauth2login-resources]]
|
|
|
-=== Additional Resources
|
|
|
-
|
|
|
-The following additional resources describe advanced configuration options:
|
|
|
-
|
|
|
-* <<oauth2login-advanced-login-page, OAuth 2.0 Login Page>>
|
|
|
-* Authorization Endpoint:
|
|
|
-** <<oauth2login-advanced-authorization-request-repository, AuthorizationRequestRepository>>
|
|
|
-* <<oauth2login-advanced-redirection-endpoint, Redirection Endpoint>>
|
|
|
-* Token Endpoint:
|
|
|
-** <<oauth2login-advanced-token-client, OAuth2AccessTokenResponseClient>>
|
|
|
-* UserInfo Endpoint:
|
|
|
-** <<oauth2login-advanced-map-authorities, Mapping User Authorities>>
|
|
|
-** <<oauth2login-advanced-custom-user, Configuring a Custom OAuth2User>>
|
|
|
-** <<oauth2login-advanced-oauth2-user-service, OAuth 2.0 UserService>>
|
|
|
-** <<oauth2login-advanced-oidc-user-service, OpenID Connect 1.0 UserService>>
|
|
|
|
|
|
[[oauth2resourceserver]]
|
|
|
== OAuth 2.0 Resource Server
|