Spring Security 5 OAuth 2 社交注销

Posted

技术标签:

【中文标题】Spring Security 5 OAuth 2 社交注销【英文标题】:Spring Security 5 OAuth 2 Social Logout 【发布时间】:2021-01-18 09:35:33 【问题描述】:

我已添加到我的 Spring Boot MVC Web 应用程序社交登录功能。它允许用户使用 GitHub、Facebook 或 Google 帐户登录我的应用程序。但我正在努力让 /logout 功能正常工作。即使调用了 /logout 并加载了 logoutSuccessUrl,如果用户再次单击登录链接,则不会再次要求用户提供其用户名或密码。看起来用户仍然是经过身份验证的。

你们如何使用新的 Spring Security 5 OAuth 2 客户端支持实现 /logout?

我使用了新的 OAuth 2 客户端支持。

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

spring.security.oauth2.client.registration.facebook.client-id =  
spring.security.oauth2.client.registration.facebook.client-secret = 

这是我的 HTTPSecurity 配置的样子:

@Override
protected void configure(HttpSecurity http) throws Exception 
    http.authorizeRequests()
        .antMatchers("/").permitAll()
        .anyRequest().authenticated()
        .and()
        .oauth2Login()
        .and()
        .logout().logoutSuccessUrl("/");

我也试过这种方法:

@覆盖 受保护的无效配置(HttpSecurity http)抛出异常 http

        .authorizeRequests()
        .antMatchers("/").permitAll()
        .antMatchers(HttpMethod.POST,"/logout").permitAll()
        .anyRequest().authenticated()
        .and()
        .oauth2Login()
        .and()
        .logout()
        .invalidateHttpSession(true)
        .clearAuthentication(true)
        .deleteCookies("JSESSIONID")
        .logoutSuccessUrl("/").permitAll()
        .and()
            .csrf()
            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());

你们如何使用新的 Spring Security OAuth 2 客户端支持注销使用社交 OAuth 2 登录提供程序之一进行身份验证的用户?

【问题讨论】:

【参考方案1】:

我目前在我的 chrome 浏览器上登录谷歌,可以查看我的 gmail 等,所以我与谷歌有一个活跃的会话。 如果我要访问您的 spring 应用程序并使用 google 登录,您的 spring 应用程序会将我重定向到 google 身份验证服务器,该服务器检测到我已经登录到 google,因此它知道我是谁,因此它只需要问我同意您的应用程序请求的范围,如果我同意向您的应用程序颁发访问令牌。 现在,如果我想退出您的应用程序,spring security 将使您的应用程序上的会话无效,但它无法控制我与谷歌打开的会话,事实上我不想也退出谷歌。 因此,如果您想再次进入第 3 方的登录屏幕,您需要转到他们的页面并注销。

【讨论】:

没错...但是如果有人在公共计算机上使用我的应用程序,使用他们的 Google 帐户登录,完成后点击注销链接会怎样。他们留下的印象是他们已经退出了。 5 分钟后,另一个用户来了,打开 google.com,并注意到他们已经用其他人的帐户登录了......这是我试图避免的。 啊,Oauth 中还没有标准的方法,这真的归结为社交登录提供商,不幸的是你并没有太多的控制权。 OIDC中有一个prompt=login参数,它指示auth server每次都重新认证用户,但是并不是到处都支持,相信google也不支持。但它有它自己的方式为您的应用程序断开用户连接,请查看注销时的开发人员 API 文档。基本上你需要另外调用提供者注销 api,也许在注销成功处理程序中。 谢谢你,@Wojciech Lesniak!

以上是关于Spring Security 5 OAuth 2 社交注销的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security 5 OAuth 2 社交注销

Spring Security 5 OAuth 2.0 ResourceServer 如何与 AuthorizationServer 通信?

配置 Spring Security 5 Oauth 2 以使用 access_token uri 参数

在 Spring Security 5 OAuth Client 和 Spring Boot 2.0 中,authorizationGrantType 不能为空

找不到带有 Spring Security 5.3.2 ReactiveClientRegistrationRepository bean 的反应式 OAuth2

使用 Spring Security 5 OAuth2 实现 Keyclock 授权服务器