首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OAuth2RestTemplate将字符集添加到内容类型标题中。

OAuth2RestTemplate将字符集添加到内容类型标题中。
EN

Stack Overflow用户
提问于 2019-04-06 00:30:11
回答 1查看 1.1K关注 0票数 4

当尝试使用OAuth2RequestTemplate获取访问令牌时,调用在请求中发送以下标头

代码语言:javascript
复制
"Content-Type", "application/x-www-form-urlencoded;charset=UTF-8”

我想放弃这个字符集,不包括在那里。

我试图通过AccessTokenRequest对象和CustomTokenProvider手动设置标头值,但没有工作。

知道它为什么会被包括在那里,以及如何摆脱它。

更新:包括代码示例

选项1 :

代码语言:javascript
复制
String oauthServerUri = "..../access_token";

ClientCredentialsResourceDetails ccDetails = new ClientCredentialsResourceDetails();
ccDetails.setClientId("clientId");
ccDetails.setClientSecret("clientSecret");
ccDetails.setGrantType("client_credentials");
ccDetails.setAccessTokenUri(oauthServerUri);

AccessTokenRequest tokenRequest = new DefaultAccessTokenRequest();

Map<String, List<String>> headers = new HashMap<>();
headers.put("Content-Type", Arrays.asList("Some Proper Value"));
tokenRequest.setHeaders(headers);
OAuth2ClientContext context = new DefaultOAuth2ClientContext(tokenRequest);

OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(ccDetails, context);
OAuth2AccessToken accessToken = restTemplate.getAccessToken();

选项2 :作为一种替代方法,我尝试了这里描述的方法:How to set HTTP Header for OAuth2RestTemplate,它正在实现AccessTokenProvider和在obtainAccessToken中设置头部。但这也于事无补。

EN

回答 1

Stack Overflow用户

发布于 2019-04-09 20:36:11

当您使构造函数成为新的OAuth2RestTemplate(ccDetails,context)时,它后面会生成一个超级(),它会生成一个RestTemplate,因为它是从它扩展而来的。

代码语言:javascript
复制
public OAuth2RestTemplate(OAuth2ProtectedResourceDetails resource, OAuth2ClientContext context) {
        super();
        if (resource == null) {
            throw new IllegalArgumentException("An OAuth2 resource must be supplied.");
        }

        this.resource = resource;
        this.context = context;
        setErrorHandler(new OAuth2ErrorHandler(resource));
    }

RestTemplate构造函数默认放置messageConverters。

代码语言:javascript
复制
public RestTemplate() {
        this.messageConverters.add(new ByteArrayHttpMessageConverter());
        this.messageConverters.add(new StringHttpMessageConverter());
......

一个解决方案可能是,一旦创建了对象restTemplate.setMessageConverters(messageConverters),您就可以使用感兴趣的MediaType从这个方法(在RestTemplate类中)删除前面的方法:

代码语言:javascript
复制
public void setMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
        Assert.notEmpty(messageConverters, "At least one HttpMessageConverter required");
        // Take getMessageConverters() List as-is when passed in here
        if (this.messageConverters != messageConverters) {
            this.messageConverters.clear();
            this.messageConverters.addAll(messageConverters);
        }
    }

编辑:

如果您看到上面的图像,您可以看到:

代码语言:javascript
复制
restTemplate.getAccessToken();

打给

代码语言:javascript
复制
getRequestCallback(resource, form, headers), extractor, form.toSingleValueMap());

protected RequestCallback getRequestCallback(OAuth2ProtectedResourceDetails resource,
        MultiValueMap<String, String> form, HttpHeaders headers) {
    return new OAuth2AuthTokenCallback(form, headers);
}

看看他的构造函数是怎么做的:

代码语言:javascript
复制
/**
     * Request callback implementation that writes the given object to the request stream.
     */
    private class OAuth2AuthTokenCallback implements RequestCallback {

        private final MultiValueMap<String, String> form;

        private final HttpHeaders headers;

        private OAuth2AuthTokenCallback(MultiValueMap<String, String> form, HttpHeaders headers) {
            this.form = form;
            this.headers = headers;
        }

        public void doWithRequest(ClientHttpRequest request) throws IOException {
            request.getHeaders().putAll(this.headers);
            request.getHeaders().setAccept(
                    Arrays.asList(MediaType.APPLICATION_JSON, MediaType.APPLICATION_FORM_URLENCODED));
            FORM_MESSAGE_CONVERTER.write(this.form, MediaType.APPLICATION_FORM_URLENCODED, request);
        }
    }

也许通过继承和覆盖方法,您可以将感兴趣的头传递给该构建器。

同样在OAuth2AccessTokenSupport中,retrieveToken方法有一些有趣的注释:

代码语言:javascript
复制
// Prepare headers and form before going into rest template call in case the URI is affected by the result
authenticationHandler.authenticateTokenRequest(resource, form, headers);
// Opportunity to customize form and headers
tokenRequestEnhancer.enhance(request, resource, form, headers);

希望我帮了你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55544818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档