Spring Cloud Security配置OAuth2客户端来访问受保护的API

2023-04-13 19:02:50 浏览数 (1)

配置OAuth2客户端

在Spring Boot应用程序中使用OAuth2客户端需要以下依赖:

代码语言:javascript复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-oauth2-client</artifactId>
</dependency>

OAuth2客户端需要一些配置来与认证服务器通信并获取访问令牌,可以在application.properties或application.yml中进行配置。以下是示例配置:

代码语言:javascript复制
spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: google-client-id
            client-secret: google-client-secret
            scope:
              - email
              - profile
        provider:
          google:
            authorization-uri: https://accounts.google.com/o/oauth2/v2/auth
            token-uri: https://www.googleapis.com/oauth2/v4/token
            user-info-uri: https://www.googleapis.com/oauth2/v3/userinfo
            user-name-attribute: email

在上面的示例中,我们配置了一个名为“google”的OAuth2客户端。该客户端需要一个client-id和client-secret,可以从Google开发者控制台中获取。客户端还指定了要获取的权限范围,包括“email”和“profile”。

我们还需要配置认证服务器的详细信息,以便OAuth2客户端可以与之通信。这里我们配置了Google的OAuth2提供程序。该提供程序的授权地址为https://accounts.google.com/o/oauth2/v2/auth,令牌地址为https://www.googleapis.com/oauth2/v4/token,用户信息地址为https://www.googleapis.com/oauth2/v3/userinfo。我们还指定了用户的名称属性为电子邮件地址。

访问受保护的API

一旦我们配置了OAuth2客户端,就可以使用它来访问受保护的API。在Spring Boot应用程序中,我们可以使用Spring Security提供的@OAuth2Client注解来获取访问令牌。以下是示例代码:

代码语言:javascript复制
@RestController
@RequestMapping("/api")
public class ApiController {

    @Autowired
    private OAuth2AuthorizedClientService clientService;

    @GetMapping("/resource")
    public String getResource() {
        OAuth2AuthenticationToken authentication = 
            (OAuth2AuthenticationToken) SecurityContextHolder.getContext().getAuthentication();
        OAuth2AuthorizedClient client = clientService.loadAuthorizedClient(
            authentication.getAuthorizedClientRegistrationId(), authentication.getName());
        String accessToken = client.getAccessToken().getTokenValue();
        // use access token to access protected resource
        return "Protected resource accessed with access token: "   accessToken;
    }
}

在上面的示例代码中,我们使用@OAuth2Client注解注入了OAuth2AuthorizedClientService。在getResource()方法中,我们从SecurityContextHolder中获取OAuth2AuthenticationToken,并使用它来获取OAuth2AuthorizedClient。然后,我们从OAuth2AuthorizedClient中获取访问令牌的值,并使用它来访问受保护的资源。

0 人点赞