5.3.3 启用第三方验证

您可能在您一些网站上看到过“使用 Facebook 登录”、“使用 Twitter 登录”这样的链接或按钮。这种方式不要求用户在特定网站上登录,而是提供了一种通过另一个网站(如 Facebook)进行登录的方式,并且他们可能已经登录过那个网站了。

这种类型的身份验证基于 OAuth2 或 OpenID Connect(OIDC)。OAuth2 是一种授权规范,第 9 章,我们将进一步讨论如何使用它来保护 REST API,这里我们讨论用它实现第三方网站身份验证。OpenID Connect 是另一个基于 OAuth2 的安全规范,在第三方身份验证期间,用于将交互规范化。

为了在 Spring 应用程序中使用这种类型的身份验证,您需要添加 OAuth2 starter 客户端:

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

然后,您至少需要配置一个或多个 OAuth2 或 OpenID 的身份验证服务器详细信息。Spring Security 支持使用 Facebook、Google、GitHub 和 Okta,您可以配置一些扩展属性,以支持其他客户端。

要使您的应用程序充当 OAuth2/OpenID 的客户端,一般需要设置的属性集如下:

spring:
  security:
    oauth2:
      client:
        registration:
          <oauth2 or openid provider name>:
            clientId: <client id>
            clientSecret: <client secret>
            scope: <comma-separated list of requested scopes>

例如,假设对于 Taco Cloud,我们希望用户能够使用 Facebook 登录。application.yml 中的以下配置将设置 OAuth2 客户端:

spring:
  security:
    oauth2:
      client:
      registration:
        facebook:
          clientId: <facebook client id>
          clientSecret: <facebook client secret>
          scope: email, public_profile

Client ID 和 secret 是识别 Facebook 应用程序的凭据。您可以通过在 https://developers.facebook.com/ 中创建新的应用程序条目来获取。scope 属性指定应用程序将被授予的访问权限。在这种情况下,应用程序将可以访问用户的电子邮件地址,以及从他们的公共 Facebook 个人资料中获取基本信息。

在一个非常简单的应用程序中,这就是您所需要的。当用户试图访问某个页面需要身份验证时,他们的浏览器将重定向到 Facebook。如果他们还没有登录 Facebook,他们将看到 Facebook 登录页面。登录 Facebook 后,他们将被要求对您的应用程序进行授权,并授予所请求范围的权限。最后,他们身份验证完成,会重定向回您的应用程序。

但是,如果您已经通过声明 SecurityFilterChainbean 自定义了安全配置,那么您启用 OAuth2 登录验证的同时,也要添加以下安全配置:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
  return http
    .authorizeRequests()
      .mvcMatchers("/design", "/orders").hasRole("USER")
      .anyRequest().permitAll()
    .and()
      .formLogin()
       .loginPage("/login")
    .and()
     .oauth2Login()

    ...

    .and()
    .build();
}

您可能还希望同时提供传统用户名/密码登录和第三方登录。在在这种情况下,您可以在配置中指定登录页面,如下所示:

.and()
  .oauth2Login()
    loginPage("/login")

这将导致应用程序始终将用户带到应用程序提供的登录页面,他们可以像往常一样选择使用用户名和密码登录。但您也可以在同一个登录页面上提供一个链接,让他们有机会登录 Facebook。在登录页面的 HTML 模板中,这样的链接可能像如下这样:

<a th:href="/oauth2/authorization/facebook">Sign in with Facebook</a>

现在,您已经处理了登录问题,让我们转到身份验证问题的另一面,了解如何启用用户注销。

results matching ""

    No results matching ""