我创建了一个包含4个主要应用程序的系统:
Web应用程序验证正常,令牌可以像处理一样处理并允许访问API,但服务器端应用程序并不是。令牌似乎是正确生成的,但是当它们被添加到请求标头并被分派时,它们只会返回401错误。
如果我通过邮递员生成令牌,它们可以正常工作,但是当我通过java应用程序生成它们时,它们不能正常工作。而且,它们似乎有不同的长度。
java应用程序使用客户端凭据流来获取令牌,并按以下方式实现:
String strBody;
try {
strBody = "client_id=" + id + "&client_secret=" + URLEncoder.encode(secret, "UTF-8") + "&grant_type=client_credentials&scope=" + scope;
} catch (UnsupportedEncodingException e) {
Logger.severe("Failed to get encode client secret with error: " + e.getMessage());
((CompletableFuture)accessToken).completeExceptionally(new Exception("Failed to get encode client secret with error: " + e.getMessage()));
return null;
}
RequestBody body = RequestBody.create(MediaType.parse("application/x-www-form-urlencoded; charset=utf-8"), strBody);
Request request = new Request.Builder().url(url).post(body).build();
String strResponse = executeRequest(request);
Logger.info("got token response: "+strResponse);
TokenResponse response = (new Gson()).fromJson(strResponse, TokenResponse.class);
if (response.getError() != null && response.getError().length() > 0) {
Logger.severe("Failed to get access token with error: " + response.getError());
((CompletableFuture)accessToken).completeExceptionally(new Exception("Failed to get access token with error: " + response.getError()));
} else {
Timers.runIn((timer, thing) -> clientCreditentalFlow(), response.getExpiresIn() - 10, TimeUnit.SECONDS);
Logger.info("token: "+accessToken);
((CompletableFuture)accessToken).complete(response.getAccessToken());
}
当我从post man发送完全相同的细节时,它返回一个工作令牌,虽然长度不同。
Web应用程序使用隐式工作流,而不是使用客户端凭据流的Java应用程序。