使用OAuth2登录Facebook Spring Boot

时间:2019-05-19 21:44:24

标签: java spring spring-boot spring-security-oauth2

我正在使用Spring Boot和Spring Security构建一个项目,我想与Facebook和Google实施注册阶段。我阅读了有关OAuth2的信息,但找不到任何指南确切说明如何使用户使用Facebook或Google注册我的服务。 我想在我的数据库中有一个引用,它告诉我该特定用户例如通过Facebook注册了... 现在,我正在使用Spring Security来处理注册和登录阶段,一切正常。

这是配置类

@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableWebSecurity
@EnableJpaRepositories(basePackageClasses = UserRepository.class)
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserDetailsService userDetailsService;

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

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .formLogin()
                    .loginPage("/login")
                    .failureUrl("/login?error=true")
                    .and()
                .logout()
                    .logoutSuccessUrl("/")
                    .deleteCookies("JSESSIONID")
                    .invalidateHttpSession(true);
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

这是CustomUserDetails类,我想它还必须具有一个属性,该属性指示该用户如何注册我的服务(facebook,google,local等)

public class CustomUserDetails extends User implements UserDetails {

    public CustomUserDetails() {
    }

    public CustomUserDetails(String username, String email, String password, Set<Role> roles) {
        super(username, email, password, roles);
    }

    public CustomUserDetails(User user) {
        super(user.getUsername(), user.getEmail(), user.getPassword(), user.getRoles());
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return getRoles()
                .stream()
                .map(role -> new SimpleGrantedAuthority(role.getRole()))
                .collect(Collectors.toList());
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

}

1 个答案:

答案 0 :(得分:1)

概述,要通过Facebook或Google登录,我们需要执行以下步骤:

  1. 用户单击通过Facebook登录通过Google登录

  2. 出现一个弹出窗口,用户单击接受

  3. 用户从Facebook或Google获得access_token并将其发送给您(Web服务器)

  4. 使用用户的access_token并使用 Google或Facebook API 进行验证并获取用户信息。

  5. 如果access_token是正确的,则为其创建用户。您可以使用令牌或会话。如果access_token不正确,则抛出exception

  6. 登录成功。

  

获取有关access_token的更多信息:   https://developers.facebook.com/docs/facebook-login/access-tokens/

enter image description here