从 OKTA API - Java(普通)示例中获取令牌

Get token from OKTA API - Java (plain) example

我已经在 OKTA 环境 here 上创建了一个帐户。 我在网上搜索过,但找不到任何关于如何从 OKTA API 获取访问令牌的示例。我正在寻找 "plain" Java 代码中的一些示例。但如果任何 SDK 中有什么东西,我会很高兴。 我尝试创建一个 HTTP 请求 (POST),到 /token 端点。我在 body 中使用了 cliend_idclient_secret。我还尝试将 header 作为基本身份验证(在此之前,我使用 Base64 编码 client_id:client_secret),但是我仍然未经授权(401)。

好的,我有办法。问题是 OKTA 上的配置错误。 对于那些需要工作示例的人,我将分享我测试过的代码(相信我,它有效)

 public String GetToken() throws IOException, InterruptedException {
    HttpClient client = HttpClient.newBuilder()
            .build();

    HttpRequest httpRequest = HttpRequest.newBuilder()
            .uri(URI.create("https://YOUR_OKTA_DOMAIN/oauth2/default/v1/token"))
            .headers("Content-type", "application/x-www-form-urlencoded",
                    "Authorization", "Basic " + Base64.getEncoder().encodeToString("CLIENT_ID:CLIENT_SECRET".getBytes()),
                    "Accept", "application/json")
            .POST(HttpRequest.BodyPublishers.ofString(
                    "&grant_type=client_credentials" ))
            .build();

    HttpResponse<?> response = client.send(httpRequest, HttpResponse.BodyHandlers.ofString());       

    return response.body().toString();
}

在 Okta 上,您需要为授权服务器创建额外的范围。这个范围应该是默认的,或者如果你不想设置默认范围,你必须在正文中添加它作为

.POST(HttpRequest.BodyPublishers.ofString(
                    "&grant_type=client_credentials" + 
                    "scope=SCOPE_NAME"))