Spring SocialでFacebookに二次ログイン

Spring SocialでのセカンダリFacebookログイン

1. 概要

このチュートリアルでは、既存のフォームログインアプリに新しいFacebookログインを追加することに焦点を当てます。

Spring Socialサポートを使用してFacebookとやり取りし、物事をクリーンでシンプルに保ちます。

2. Mavenの構成

まず、pom.xmlspring-social-facebook依存関係を追加する必要があります。


    org.springframework.social
    spring-social-facebook

3. セキュリティ構成-ログインするだけ

まず、フォームベースの認証がある単純なセキュリティ構成から始めましょう。

@Configuration
@EnableWebSecurity
@ComponentScan(basePackages = { "org.example.security" })
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth)
      throws Exception {
        auth.userDetailsService(userDetailsService);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .csrf().disable()
        .authorizeRequests()
        .antMatchers("/login*").permitAll()
        .anyRequest().authenticated()
        .and()
        .formLogin().loginPage("/login").permitAll();
    }
}

この構成に多くの時間を費やすことはありません。よりよく理解したい場合は、the form login articleを参照してください。

4. セキュリティ構成–Facebookの追加

それでは、Facebookによって駆動される、システムに認証するための新しい方法を追加しましょう。

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private ConnectionFactoryLocator connectionFactoryLocator;

    @Autowired
    private UsersConnectionRepository usersConnectionRepository;

    @Autowired
    private FacebookConnectionSignup facebookConnectionSignup;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .authorizeRequests()
        .antMatchers("/login*","/signin/**","/signup/**").permitAll()
        ...
    }

    @Bean
    public ProviderSignInController providerSignInController() {
        ((InMemoryUsersConnectionRepository) usersConnectionRepository)
          .setConnectionSignUp(facebookConnectionSignup);

        return new ProviderSignInController(
          connectionFactoryLocator,
          usersConnectionRepository,
          new FacebookSignInAdapter());
    }
}

新しい構成を注意深く見てみましょう。

  • Facebook認証を有効にするためにProviderSignInControllerを使用しています

  • POSTを「/signin/facebook」に送信することにより–このコントローラーは、Facebookサービスプロバイダーを使用してユーザーサインインを開始します

  • アプリケーションのログインロジックを処理するためにSignInAdapterを設定しています

  • また、ユーザーがFacebookで最初に認証するときに、ユーザーのサインアップを暗黙的に処理するようにConnectionSignUpを設定します。

5. サインインアダプター

簡単に言えば、このアダプターは、上記のコントローラー(Facebookユーザーのサインインフローを促進する)と特定のローカルアプリケーションとの間のブリッジです。

public class FacebookSignInAdapter implements SignInAdapter {
    @Override
    public String signIn(
      String localUserId,
      Connection connection,
      NativeWebRequest request) {

        SecurityContextHolder.getContext().setAuthentication(
          new UsernamePasswordAuthenticationToken(
          connection.getDisplayName(), null,
          Arrays.asList(new SimpleGrantedAuthority("FACEBOOK_USER"))));

        return null;
    }
}

Facebookを使用してログインしたユーザーには役割FACEBOOK_USERがあり、フォームを使用してログインしたユーザーには役割USER.があります。

6. 接続サインアップ

ユーザーが初めてFacebookで認証するとき、アプリケーションに既存のアカウントはありません。

これは、それらのアカウントを自動的に作成する必要があるポイントです。 ConnectionSignUpを使用して、そのユーザー作成ロジックを駆動します。

@Service
public class FacebookConnectionSignup implements ConnectionSignUp {

    @Autowired
    private UserRepository userRepository;

    @Override
    public String execute(Connection connection) {
        User user = new User();
        user.setUsername(connection.getDisplayName());
        user.setPassword(randomAlphabetic(8));
        userRepository.save(user);
        return user.getUsername();
    }
}

ご覧のとおり、DisplayNameをユーザー名として使用して、新しいユーザーのアカウントを作成しました。

7. Facebookプロパティ

次に、application.propertiesでFacebookのプロパティを構成しましょう。

spring.social.facebook.appId=YOUR_APP_ID
spring.social.facebook.appSecret=YOUR_APP_SECRET

ご了承ください:

  • appIdappSecretを取得するには、Facebookアプリケーションを作成する必要があります

  • Facebookアプリケーションの設定から、プラットフォームの「Webサイト」を追加し、http://localhost:8080/が「サイトのURL」であることを確認してください

8. フロントエンド

最後に、フロントエンドを見てみましょう。

ログインページで、フォームログインとFacebookの2つの認証フローをサポートする予定です。



You have been logged out
There was an error, please try again

最後に–これがindex.htmlです:





Welcome, Username

User authorities

このインデックスページがどのようにユーザー名と権限を表示しているかに注意してください。

これで、アプリケーションを認証する方法が2つあります。

9. 結論

この簡単な記事では、spring-social-facebookを使用してアプリケーションの2次認証フローを実装する方法を学びました。

そしてもちろん、いつものように、ソースコードは完全に利用可能ですover on GitHub