You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从OKTA获取Access Token?Java中Session Token转Access Token方法

用Java将Okta Session Token转换为Access Token

首先明确:okta-authn-sdk-api 仅负责身份认证流程(比如获取Session Token),不提供OAuth2授权相关的接口——你要找的/oauth2/default/v1/authorize属于OAuth2授权范畴,需要通过以下两种方式实现转换:

方法一:使用Okta OAuth2 SDK(推荐)

Okta官方的okta-oauth2-sdk专门处理OAuth2流程,支持用Session Token直接换取Access Token。

1. 依赖配置(Maven)

<dependency>
    <groupId>com.okta.sdk</groupId>
    <artifactId>okta-oauth2-sdk</artifactId>
    <version>请使用最新稳定版本</version>
</dependency>

2. 代码实现

采用password授权类型,将Session Token作为凭证传入:

import com.okta.oauth2.client.OktaOAuth2Client;
import com.okta.oauth2.client.OktaOAuth2ClientBuilder;
import com.okta.oauth2.client.token.TokenResponse;

public class SessionTokenConverter {
    public static void main(String[] args) {
        // 初始化OAuth2客户端
        OktaOAuth2Client oAuth2Client = new OktaOAuth2ClientBuilder()
                .setIssuer("https://你的Okta域名/oauth2/default")
                .setClientId("你的客户端ID")
                .setClientSecret("你的客户端密钥(机密客户端必填)")
                .build();

        // 用Session Token换取Access Token
        TokenResponse tokenResponse = oAuth2Client.token()
                .setGrantType("password")
                .setUsername("关联的用户用户名")
                .setPassword("已获取的Session Token")
                .setScope("openid profile api://default/你的资源权限") // 根据需求设置权限范围
                .execute();

        // 获取最终的Access Token
        String accessToken = tokenResponse.getAccessToken().getTokenValue();
        System.out.println("Access Token: " + accessToken);
    }
}

方法二:直接调用Okta Token端点(无SDK依赖)

如果不想引入额外SDK,可直接用HTTP客户端调用/oauth2/default/v1/token端点:

示例代码(OkHttp实现)

import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.json.JSONObject;

import java.io.IOException;

public class RawTokenConverter {
    public static void main(String[] args) throws IOException {
        OkHttpClient client = new OkHttpClient();

        // 构造请求表单参数
        FormBody formBody = new FormBody.Builder()
                .add("grant_type", "password")
                .add("username", "关联的用户用户名")
                .add("password", "已获取的Session Token")
                .add("scope", "openid profile api://default/你的资源权限")
                .add("client_id", "你的客户端ID")
                .add("client_secret", "你的客户端密钥(机密客户端必填)")
                .build();

        Request request = new Request.Builder()
                .url("https://你的Okta域名/oauth2/default/v1/token")
                .post(formBody)
                .build();

        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) throw new IOException("请求失败: " + response.code());

            // 解析响应JSON
            JSONObject responseJson = new JSONObject(response.body().string());
            String accessToken = responseJson.getString("access_token");
            System.out.println("Access Token: " + accessToken);
        }
    }
}

关键注意事项

  • 客户端类型区分:公共客户端(如SPA)无需传入client_secret,机密客户端(如后端服务)必须传入。
  • Session Token有效期:Session Token通常仅几分钟有效,需在有效期内完成转换。
  • 权限范围设置:根据你要查询的服务器资源,配置对应的scope(比如api://default/read-data)。

内容的提问来源于stack exchange,提问作者ergonaut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 09:00:05