我在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
进行注释答案 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;
}