如何在使用 OAuth2 社交登录保护 REST API 的同时配置 Spring Boot 登录页面

Posted

技术标签:

【中文标题】如何在使用 OAuth2 社交登录保护 REST API 的同时配置 Spring Boot 登录页面【英文标题】:How to configure Spring boot login page while securing REST API using OAuth2 social login 【发布时间】:2021-11-05 23:04:13 【问题描述】:

我有一个使用 Google 的 Spring OAuth2 身份验证的示例 Web 应用程序。 HttpSecurity配置如下:

protected void configure(HttpSecurity http) throws Exception 
                http.authorizeRequests()
            .antMatchers("/", "/login", "/oauth/**", "/oauth2/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .formLogin().permitAll()
                .loginPage("/login")
                .usernameParameter("email")
                .passwordParameter("pass")
                .defaultSuccessUrl("/list")
            .and()
            .oauth2Login()
            .loginPage("/login")
                .userInfoEndpoint()
                    .userService(oauthUserService)
                .and()
                .successHandler( ... NOT SHOWN ...)
            .and()
            .logout().logoutSuccessUrl("/").permitAll()
            .and()
            .exceptionHandling().accessDeniedPage("/403")
            ;
    

现在,无论何时发出未经身份验证的请求,此配置都会将浏览器重定向到登录页面。此页面显示了指向 Google 身份验证 Login with Google 的链接以及登录表单。

但我希望将浏览器直接重定向到 Google 的身份验证服务器,而不是应用程序的登录页面。我不想要任何表单登录/注册功能。我只希望用户使用 Google 登录。

需要在上述配置中进行哪些更改才能实现这一目标?

【问题讨论】:

【参考方案1】:

尝试从您的配置中删除 formLoginloginPage..

protected void configure(HttpSecurity http) throws Exception 
                http.authorizeRequests()
            .antMatchers("/", "/login", "/oauth/**", "/oauth2/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .oauth2Login()
                .userInfoEndpoint()
                    .userService(oauthUserService)
                .and()
                .successHandler( ... NOT SHOWN ...)
            .and()
            .logout().logoutSuccessUrl("/").permitAll()
            .and()
            .exceptionHandling().accessDeniedPage("/403")
            ;
    

【讨论】:

太酷了。所以,根本不需要设置 .loginPage!

以上是关于如何在使用 OAuth2 社交登录保护 REST API 的同时配置 Spring Boot 登录页面的主要内容,如果未能解决你的问题,请参考以下文章

使用 Passport 和 OAuth2 + 社交网络的 NodeJS REST 身份验证

如何实现FosOAuthServerBundle来保护REST API?

Spring Boot 和 OAuth2 社交登录,无法获取 refreshToken

使用 OAuth2 保护 REST Web 服务:一般原则

如何使用 REST + CodeceptJS 测试 API,访问受 Auth0 保护?

使用 OAuth2 保护单体私有 REST api? [关闭]