OAuth2客户端应发送自定义属性

时间:2017-10-31 08:21:52

标签: spring spring-boot oauth2client

我在spring boot

中实现了Oauth2客户端
class ExampleViewController : UIViewController {

    var dataSource: Struct {
        var customerList: [Customer]? { didSet { reloadDisplay(); } }
        var supplierList: [Supplier]? { didSet { reloadDisplay(); } }
        var inventoryList: [Inventory]? { didSet { reloadDisplay(); } }
    }

    func reloadDisplay() {
        // do UI related things here
    }

}

我们运行代码,请求机构的令牌为 client_id& client_secret(默认情况下)

我们能发送的是客户方式吗? 就像我想发送它作为clientId& clientSecret。

注意:Class使用@ EnableOAuth2Client

进行注释

1 个答案:

答案 0 :(得分:0)

名称' client_id'和' client_secret'由OAuth 2指定 所以通常没有必要改变这些。

但是,Spring使用org.springframework.security.oauth2.client.token.auth.DefaultClientAuthenticationHandler

发布client_id和client_secret。在那里你可以看到字段名称是硬编码的:

form.set("client_id", resource.getClientId());
                if (StringUtils.hasText(clientSecret)) {
                    form.set("client_secret", clientSecret);
                }

您可以尝试将DefaultClientAuthenticationHandler子类化,并使用您自己的字段名称。但是因为它是用新的'在OAuth2AccessTokenSupport中,您还需要对其进行子类化,依此类推......

这可能很棘手,更好的方法是添加一个 org.springframework.http.client.ClientHttpRequestInterceptor 在org.springframework.security.oauth2.client.OAuth2RestTemplate

在其方法中创建一个实现ClientHttpRequestInterceptor的类 org.springframework.http.client.ClientHttpRequestInterceptor#拦截 您需要使用提供的byte []类型的主体创建新请求。 将其转换为String,替换字段名称,使用它创建新请求,然后按照intercept()方法的javadoc中的描述继续。

要注册拦截器,请创建一个OAuth2RestTemplate类型的spring bean并在那里注册拦截器

@Bean
OAuth2RestTemplate oAuth2RestTemplate(){
OAuth2RestTemplate template=new OAuth2RestTemplate;

ClientHttpRequestInterceptor interceptor= new ... //create your  interceptor here
template.setInterceptors(Arrays.asList(interceptor));

return template;
}