[JAVA] Connexion SNS avec Spring Boot

Aperçu

Il s'agit d'un mémo lorsque la fonction de connexion SNS est implémentée dans l'application Web créée par Spring Boot.

environnement

Java 8 (désolé) Spring Boot 2.1.0.RELEASE

Spring Social est EOL

https://projects.spring.io/spring-social/ https://spring.io/blog/2018/07/03/spring-social-end-of-life-announcement

Bibliothèque utilisée

https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-oauth2-client

SNS à mettre en œuvre

la mise en oeuvre

①POM

pom.xml


<!-- OAuth2 authentication-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>

②configuration

SecurityConfig



//Seule la partie liée à la connexion est extraite.
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @NonNull
    SaveAndGenerateUserDetails saveAndGenerateUserDetails

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                //Connexion SNS
                .oauth2Login()
                    .loginPage("/login")
                    .userInfoEndpoint()
                    //Classe de service à exécuter lors de l'authentification OAuth
                    .userService(new OAuth2UserService(saveAndGenerateUserDetails))
                    //Classe de service à exécuter lors de l'authentification OpenId
                    .oidcUserService(new OidcUserDetailsService(saveAndGenerateUserDetails))
                .and()
                    //Implémentez SuccessHandler si nécessaire
                    .successHandler(new MyAuthenticationSuccessHandler())
                    //Implémentez SuccessHandler si nécessaire. Cette fois est la valeur par défaut.
                    .failureHandler(new SimpleUrlAuthenticationFailureHandler("/login?error"))
            .and()
                //La connexion ID PASS peut coexister
                .formLogin()
                    .loginPage("/login")
                        .usernameParameter("username")
                        .passwordParameter("password")
                        .permitAll()
                    .successHandler(new FormLoginSuccessHandler())
                    .failureHandler(new SimpleUrlAuthenticationFailureHandler("/login?error"))
            .and()
                .logout()
                    .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                    .logoutSuccessUrl("/")
                    .invalidateHttpSession(true)
                    .deleteCookies("JSESSIONID")
                    .permitAll()
            .and()
                .exceptionHandling();


}

③application.yml

application.yml


spring:
  security:
    oauth2:
      client:
        registration:
          facebook:
            client-id: 【client-id】
            client-secret: 【client-secret】
            scope:
              - email
              - public_profile
            redirect-uri:[URL de l'application]/login/oauth2/code/{registrationId}
          google:
            client-id: 【client-id】
            client-secret: 【client-secret】
            scope:
              - email
              - profile
              - openid
            redirect-uri:[URL de l'application]/login/oauth2/code/{registrationId}
        provider:
          facebook:
            authorizationUri: https://www.facebook.com/v3.3/dialog/oauth
            tokenUri: https://graph.facebook.com/v3.3/oauth/access_token
            userInfoUri: https://graph.facebook.com/v3.3/me

④view

login.html


<!--Créez un lien qui définit le point de terminaison de chaque connexion SNS.
Les points de terminaison sont des valeurs fixes et sont les suivants.-->
<!--~ Diverses omissions ~-->
<a href="/oauth2/authorization/facebook">Identifiant Facebook</a>
<a href="/oauth2/authorization/google">Connexion Google</a>
<!--~ Diverses omissions ~-->

⑤Service ⑤-1 classe OAuth (définie dans .userService () de SecurityConfig)

OAuth2UserService.java


@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class OAuth2UserService
        extends DefaultOAuth2UserService {

    @NonNull
    SaveAndGenerateUserDetails saveAndGenerateUserDetails

    @Override
    @Transactional(readOnly = false)
    public OAuth2User loadUser(OAuth2UserRequest userRequest)
            throws OAuth2AuthenticationException {
        
        //L'introduction de la classe d'implémentation est omise.
        //Contour:
        //Créez une classe pour chaque SNS à créer une branche avec registrationId et récupérez les informations que vous souhaitez acquérir.
        //Enregistrer les informations utilisateur dans la base de données en fonction des informations acquises
        //Informations d'authentification basées sur les informations acquises(UserDetails)Sera retourné.
        //Le type de retour de cette classe diffère selon la méthode d'authentification, mais le type de retour de la méthode de processus est MyUserDetails.
        //Nous allons donc ici absorber la différence de méthode d'authentification.
        return saveAndGenerateUserDetails.process(userRequest,
                super.loadUser(userRequest));
    }
}

⑤-2 Traitement après l'authentification OpenId (défini dans .oidcUserService () de SecurityConfig)

OidcUserDetailsService.java


@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class OidcUserDetailsService
        extends OidcUserService {

    @NonNull
    SaveAndGenerateUserDetails saveAndGenerateUserDetails;

    @Override
    @Transactional(readOnly = false)
    public OidcUser loadUser(OidcUserRequest userRequest)
            throws OAuth2AuthenticationException {
        
        // ⑤-Identique à 1
        return saveAndGenerateUserDetails.process(userRequest,
                super.loadUser(userRequest));
    }
}

⑥ Classe MyUserDetails

MyUserDetails.java


@SuppressWarnings("serial")
@Data
public class MyUserDetails implements UserDetails, OAuth2User, OidcUser {

    // @Quelle méthode doit être remplacée?
    //Seule la partie nécessaire à la connexion SNS est extraite.

    private Map<String, Object> attributes;

    //constructeur
    public MyUserDetails(MyUser user, Map<String, Object> attr) {
        //Seules les informations OAuth et OpenId sont répertoriées.
        this.attributes = attr;
    }
}

Impressions

・ Il y avait moins de cours à préparer par moi-même que ce à quoi je m'attendais. ・ Il est utile que la bibliothèque fasse quelque chose de bien, mais c'était une boîte noire. ・ Si vous implémentez un type d'oauth et un type d'openid, vous pouvez facilement étendre horizontalement.

URL de référence

Recommended Posts

Connexion SNS avec Spring Boot
Télécharger avec Spring Boot
Essayez d'implémenter la fonction de connexion avec Spring Boot
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Implémenter GraphQL avec Spring Boot
Démarrez avec Spring Boot
Bonjour tout le monde avec Spring Boot!
Téléchargement de fichiers avec Spring Boot
Spring Boot commençant par copie
Fonction de connexion avec Spring Security
Spring Boot à partir de Docker
Hello World avec Spring Boot
Définir des cookies avec Spring Boot
Utiliser Spring JDBC avec Spring Boot
Ajouter un module avec Spring Boot
Premiers pas avec Spring Boot
Créer un micro service avec Spring Boot
Envoyer du courrier avec Spring Boot
Utiliser l'authentification de base avec Spring Boot
gRPC sur Spring Boot avec grpc-spring-boot-starter
Créez une application avec Spring Boot 2
Déploiement à chaud avec le développement Spring Boot
Liaison de base de données avec doma2 (Spring boot)
Programmation Spring Boot avec VS Code
Jusqu'à "Hello World" avec Spring Boot
Créer une application d'enquête avec Spring Boot
Obtenez des résultats de validation avec Spring Boot
(Intellij) Hello World avec Spring Boot
Créez une application avec Spring Boot
Google Cloud Platform avec Spring Boot 2.0.0
J'ai essayé GraphQL avec Spring Boot
[Java] Intégration LINE avec Spring Boot
À partir de Spring Boot 0. Utilisez Spring CLI
J'ai essayé Flyway avec Spring Boot
La coopération des messages a commencé avec Spring Boot
J'ai essayé d'implémenter un client OAuth avec Spring Boot / Security (connexion LINE)
Hello World avec Eclipse + Spring Boot + Maven
Envoyez des notifications régulières avec LineNotify + Spring Boot
Partie 1: Essayez d'utiliser la connexion OAuth 2.0 prise en charge par Spring Security 5 avec Spring Boot
HTTPS avec Spring Boot et Let's Encrypt
Défi Spring Boot
Essayez d'utiliser Spring Boot avec VS Code
Démarrez le développement d'applications Web avec Spring Boot
Lancez l'application Nginx + Spring Boot avec docker-compose
J'ai essayé l'initialisation paresseuse avec Spring Boot 2.2.0
Forme de botte de printemps
Implémenter CRUD avec Spring Boot + Thymeleaf + MySQL
Traitement asynchrone avec Spring Boot en utilisant @Async
Implémenter la fonction de pagination avec Spring Boot + Thymeleaf
Spring Boot Rappelez-vous
gae + botte à ressort
(IntelliJ + gradle) Hello World avec Spring Boot
Utiliser le cache avec EhCashe 2.x avec Spring Boot
Test de validation de classe de formulaire avec Spring Boot
Exécutez l'application WEB avec Spring Boot + Thymeleaf
Obtenez une authentification BASIC avec Spring Boot + Spring Security