> For the complete documentation index, see [llms.txt](https://cwiki-us.gitbook.io/spring-boot-reference-guide-zh/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cwiki-us.gitbook.io/spring-boot-reference-guide-zh/iv.-spring-boot-features/28.-security/28.3-customizing-the-user-info-resttemplate/28.3.1-client.md).

# 28.3.1 客户端

为了将web-app放入一个OAuth2客户端，你只需注解`@EnableOAuth2Client`，Spring Boot会创建`OAuth2ClientContext`和`OAuth2ProtectedResourceDetails`，这些是创建`OAuth2RestOperations`必需的。Spring Boot不会自动创建该bean，但你自己创建也不费力：

```java
@Bean
public OAuth2RestTemplate oauth2RestTemplate(OAuth2ClientContext oauth2ClientContext,
        OAuth2ProtectedResourceDetails details) {
    return new OAuth2RestTemplate(details, oauth2ClientContext);
}
```

**注** 你可能想添加一个限定名（qualifier），因为应用中可能定义多个`RestTemplate`。

该配置使用`security.oauth2.client.*`作为证书（跟授权服务器使用的相同），此外，它也需要知道授权服务器中认证和token的URIs，例如：

```
security:
    oauth2:
        client:
            clientId: bd1c0a783ccdd1c9b9e4
            clientSecret: 1a9030fbca47a5b2c28e92f19050bb77824b5ad1
            accessTokenUri: https://github.com/login/oauth/access_token
            userAuthorizationUri: https://github.com/login/oauth/authorize
            clientAuthenticationScheme: form
```

具有该配置的应用在使用`OAuth2RestTemplate`时会重定向到GitHub以完成授权，如果已经登陆GitHub，你甚至不会注意到它已经授权过了。那些特殊的凭证（credentials）只在应用运行于8080端口时有效（为了更灵活，在GitHub或其他提供商上注册自己的客户端app）。

在客户端获取access token时，你可以设置`security.oauth2.client.scope`（逗号分隔或一个YAML数组）来限制它请求的作用域（scope）。作用域默认是空的，默认值取决于授权服务器，通常依赖于它拥有的客户端在注册时的设置。

**注** 对`security.oauth2.client.client-authentication-scheme`也有设置，默认为"header"（如果你的OAuth2提供商不喜欢header认证，例如Github，你可能需要将它设置为“form”）。实际上，`security.oauth2.client.*`属性绑定到一个`AuthorizationCodeResourceDetails`实例，所以它的所有属性都可以指定。

**注** 在一个非web应用中，你仍旧可以创建一个`OAuth2RestOperations`，并且跟`security.oauth2.client.*`配置关联。在这种情况下，它是一个“client credentials token grant”，如果你使用它的话就需要获取（此处不需要注解`@EnableOAuth2Client`或`@EnableOAuth2Sso`）。为了防止基础设施定义，只需要将`security.oauth2.client.client-id`从配置中移除（或将它设为空字符串）。
