如何从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
相关产品推荐
相关产品推荐

