ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# 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,例如: ```text 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`从配置中移除(或将它设为空字符串)。