首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReadyApi为什么授权头不起作用,但基本身份验证选项卡起作用

ReadyApi为什么授权头不起作用,但基本身份验证选项卡起作用
EN

Stack Overflow用户
提问于 2017-12-21 05:59:50
回答 2查看 291关注 0票数 0

我正在尝试重新创建一个REST调用,我在java的Ready-API中使用了它,但是遇到了问题。

如果我在ReadyAPI中发出GET请求,并使用UI中的AUTH选项卡,并将其设置为Basic,并输入用户名和密码,然后选中“使用全局首选项”,则可以正常工作。但是,如果我选择“抢先认证”,它就会失败。

同样,在readyAPI中,如果我插入一个带有base64编码字符串的授权标头,而不是使用"Auth“选项卡,它也会失败。这适用于我试图与之交谈的其他服务器,但不适用于这台服务器。

我正在尝试找出使用Authorization头失败的原因。因为我正在尝试使用restTemplate从java发出相同的调用。

类似于:

代码语言:javascript
复制
    String plainCreds = username + ":" + password;
    byte[] plainCredsBytes = StringUtils.getBytesUtf8(plainCreds);
    String base64Creds = Base64.encodeBase64String(plainCredsBytes);

    httpHeaders = new HttpHeaders();
    httpHeaders.add(HttpHeaders.AUTHORIZATION, "Basic " + base64Creds);

当使用带有“使用全局首选项”的身份验证选项卡时,ReadyAPI有什么不同之处使其成功?我如何在Java中做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2017-12-21 08:45:30

基本鉴权方案需要通过,方案名称要大写:

代码语言:javascript
复制
httpHeaders.add(HttpHeaders.AUTHORIZATION, "Basic " + base64Creds);

https://www.rfc-editor.org/rfc/rfc7617第2节:“基本”身份验证方案

票数 0
EN

Stack Overflow用户

发布于 2021-11-17 11:27:57

我知道这是一个老生常谈的问题,但我希望这对某些人有所帮助。

我有同样的场景,我在这里找到了解决方案:https://www.baeldung.com/resttemplate-digest-authentication

基本上,您必须创建自己的RestTemplate bean,所以授权是由摘要进行的,而不是基本的:

代码语言:javascript
复制
@Bean(name = "myRestTemplate")
public RestTemplate myRestTemplate(
        final String username,
        final String password) {
    CloseableHttpClient client = HttpClientBuilder.create().
            setDefaultCredentialsProvider(provider(username,password)).useSystemProperties().build();

    HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(client);

    return new RestTemplate(requestFactory);
}

private CredentialsProvider provider(String username, String password) {
    CredentialsProvider provider = new BasicCredentialsProvider();
    UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(username, password);
    provider.setCredentials(AuthScope.ANY, credentials);
    return provider;
}

然后,当您想要使用bean时

代码语言:javascript
复制
private String getQueryOutput(String query) {
    HttpHeaders httpHeaders = new HttpHeaders();

    httpHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

    ResponseEntity<String> resp = restTemplate.exchange(
            "https://myURL/to/accept/post",
            HttpMethod.POST,
            new HttpEntity<>(query, httpHeaders),
            String.class);

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

https://stackoverflow.com/questions/47914951

复制
相关文章

相似问题

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