为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Spring Security(非 OAuth)使用登录名、密码和 Facebook

使用 Spring Security(非 OAuth)使用登录名、密码和 Facebook

缥缈止盈 2021-09-03 15:46:16
我已经使用 Spring Security 使用登录名和密码实现了注册和身份验证。我使用本教程做到了这一点。但现在我想使用 Facebook Id 提供注册和身份验证。我将在移动应用程序上获取 Facebook 用户的访问令牌,然后将此访问令牌发送到我的 Spring 服务器(因此 OAuth 不适合),使用 Facebook API 对其进行验证,并获取 Facebook 用户 ID。请注意,Users我的数据库中已经有包含user_id, login, password,fb_id列的表,因此注册有两种变体:要么用户有登录名和密码,要么用户只有 Facebook 帐户,我将使用他的 Facebook id。最后,我只需要对该用户进行身份验证并返回给他 JWT 令牌。已经存在的代码。安全配置:@Configuration@EnableWebSecurity@EnableGlobalMethodSecurity(        securedEnabled = true,        jsr250Enabled = true,        prePostEnabled = true)public class SecurityConfig extends WebSecurityConfigurerAdapter {    @Autowired    private CustomUserDetailsService customUserDetailsService;    @Autowired    private JwtAuthenticationEntryPoint unauthorizedHandler;    @Bean    public JwtAuthenticationFilter jwtAuthenticationFilter() {        return new JwtAuthenticationFilter();    }    @Override    public void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {        authenticationManagerBuilder                .userDetailsService(customUserDetailsService)                .passwordEncoder(passwordEncoder());    }    @Bean(BeanIds.AUTHENTICATION_MANAGER)    @Override    public AuthenticationManager authenticationManagerBean() throws Exception {        return super.authenticationManagerBean();    }    @Bean    public PasswordEncoder passwordEncoder() {        return new BCryptPasswordEncoder();    }
查看完整描述

1 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

您可以创建一个 API

  • id_token从请求正文中的客户端获取。

  • 调用 facebook 的 API 来验证id_token并获取用户的详细信息。

  • 在数据库中保存或更新用户。

  • 验证用户

  • 创建并返回 JWT

这是一个示例代码 -

@PostMapping("/signin/facebook")

public ResponseEntity<?> signInWithFacebook(@Valid @RequestBody FBLoginRequest loginRequest) {


    // Call facebook's API to validate id_token and get user's details


    // Register new user (Note: Also add code to check if a user already exists with the given facebookId )

    User user = new User(fbName, fbID,

            emailId, null);

    Role userRole = roleRepository.findByName(RoleName.ROLE_USER)

            .orElseThrow(() -> new AppException("User Role not set."));

    user.setRoles(Collections.singleton(userRole));


    User result = userRepository.save(user);


    // Authenticate User

    UserPrincipal userPrincipal = UserPrincipal.create(result);

    PreAuthenticatedAuthenticationToken authentication = new PreAuthenticatedAuthenticationToken(userPrincipal, null, userPrincipal.getAuthorities());

    SecurityContextHolder.getContext().setAuthentication(authentication);


    // Generate and return token

    String jwt = tokenProvider.generateToken(authentication);

    return ResponseEntity.ok(new JwtAuthenticationResponse(jwt));

}

我没有添加调用 facebook 的 API 的代码。但这应该很容易实现。


查看完整回答
反对 回复 2021-09-03
  • 1 回答
  • 0 关注
  • 163 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信