我如何从 HttpClient 获取承载令牌?

Posted

技术标签:

【中文标题】我如何从 HttpClient 获取承载令牌?【英文标题】:How i can get the Bearer Token from HttpClient? 【发布时间】:2019-09-28 00:12:07 【问题描述】:

我正在尝试通过 HttpClient 发送 POST 请求,但服务器响应显示“未经授权”错误。我如何获得不记名令牌?我搜索了解决方案,但我不明白..

这是我的代码,我不知道如何获取请求的令牌...

HttpPost request = new HttpPost("http://domain...");
request.setHeader(HttpHeaders.ACCEPT, "application/json, text/plain, */*");
request.setHeader(HttpHeaders.CONTENT_TYPE, "application/#json");
request.setHeader(HttpHeaders.ACCEPT_LANGUAGE, "de,en-US;q=0.7,en;q=0.3");
request.setHeader(HttpHeaders.ACCEPT_ENCODING, "gzip, deflate, br");
request.setHeader(HttpHeaders.REFERER, "https://domain...");
request.setHeader("DNT", "1");
request.setHeader(HttpHeaders.HOST, "host..");
String authToken = ""; // ... ?
request.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + authToken);
StringEntity params = new StringEntity("");
params.setContentEncoding("UTF-8");
request.setEntity(params);
response = this.getHttpClient().execute(request);

【问题讨论】:

【参考方案1】:

首先,您必须使用用户名和密码(使用 HTTP 调用)对用户进行身份验证,然后您将获得令牌作为响应,您可以将其添加到标题中的下一个 POST 调用中。

在您的 POST 调用之前需要一个 get/post 调用,以便您获得令牌。 相同的令牌可用于所有进一步的调用。

【讨论】:

【参考方案2】:

您似乎正在尝试访问一些 API,这需要您先获取一些访问令牌(承载令牌)才能访问实际 API。

大多数流程涉及两个步骤,如下所述。

第 1 步。 使用基本身份验证获取不记名令牌(以下端点和参数是示例值,您的 API 会有所不同)

发布/授权 `request.setHeader(HttpHeaders.AUTHORIZATION, "Basic" + authToken);`

第 2 步: Step1 会给你某种访问令牌作为响应。您需要使用它来进行任何后续 API 调用。

GET /学生/马克 `request.setHeader(HttpHeaders.AUTHORIZATION, "Bearer" + authToken);`

您可以在What is the OAuth 2.0 Bearer Token exactly?阅读有关不记名令牌的更多信息

如果您仍有任何疑问或无法使用我提到的方法访问您的 API,请告诉我。

【讨论】:

您好,这很有帮助!但我没有 api 文档。我如何在 firefox 中通过控制台找到 /auth url?我通过实时 http 标头尝试它,但我找不到任何解决方案 您将需要 API 文档。自己很难猜到:)

以上是关于我如何从 HttpClient 获取承载令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Rest Assured 从 KeyCloak 服务获取承载令牌

HttpClient中的授权承载令牌?

使用承载令牌在 C# 中构建 post HttpClient 请求

流动客户端主题时如何在 C# HttpClient 中设置 OIDC/OAuth 不记名令牌

如何在axios中配置授权承载令牌?

如何简单地获取承载令牌以向 Azure DevOps API 发送请求?