Skip to content

Commit efb5243

Browse files
lishengzxcclaude
andcommitted
feat(auth): call GenerateCLIAccessToken on open-api login
When logging in with --open-api, call the GenerateCLIAccessToken API using the provided AK/SK to obtain an access token and persist it alongside the credentials in config.json. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 03f0e7c commit efb5243

2 files changed

Lines changed: 73 additions & 1 deletion

File tree

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { Client, REGIONS, type Identity, type Region, type Settings } from "bailian-cli-core";
2+
3+
const API_VERSION = "2026-02-10";
4+
const API_ACTION = "GenerateCLIAccessToken";
5+
const API_PATH = "/modelstudio/cli/generateAccessToken";
6+
7+
const MODEL_STUDIO_HOSTS: Partial<Record<Region, string>> = {
8+
cn: "modelstudio.cn-beijing.aliyuncs.com",
9+
intl: "modelstudio.ap-southeast-1.aliyuncs.com",
10+
};
11+
12+
function resolveRegion(baseUrl: string): Region {
13+
for (const [region, url] of Object.entries(REGIONS) as Array<[Region, string]>) {
14+
if (baseUrl === url || baseUrl.startsWith(`${url}/`)) return region;
15+
}
16+
return "cn";
17+
}
18+
19+
function modelStudioHost(baseUrl: string): string {
20+
const region = resolveRegion(baseUrl);
21+
return MODEL_STUDIO_HOSTS[region] ?? MODEL_STUDIO_HOSTS.cn!;
22+
}
23+
24+
interface GenerateCLIAccessTokenResponse {
25+
Success?: boolean;
26+
Code?: string;
27+
Message?: string;
28+
Data?: Record<string, unknown>;
29+
}
30+
31+
export async function generateCLIAccessToken(opts: {
32+
identity: Identity;
33+
settings: Settings;
34+
baseUrl: string;
35+
accessKeyId: string;
36+
accessKeySecret: string;
37+
}): Promise<any> {
38+
const { identity, settings, baseUrl, accessKeyId, accessKeySecret } = opts;
39+
40+
const client = new Client({
41+
identity,
42+
settings,
43+
baseUrl,
44+
openApiCred: { accessKeyId, accessKeySecret, source: "flag" },
45+
});
46+
47+
const host = modelStudioHost(baseUrl);
48+
49+
return client.openApiQueryJson<GenerateCLIAccessTokenResponse>({
50+
host,
51+
path: API_PATH,
52+
action: API_ACTION,
53+
version: API_VERSION,
54+
method: "POST",
55+
queryParams: {},
56+
});
57+
}

packages/commands/src/commands/auth/login.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
runConsoleLogin,
66
validateAndPersistApiKey,
77
} from "./login-console.ts";
8+
import { generateCLIAccessToken } from "./generate-access-token.ts";
89

910
const LOGIN_MODE_HINT = "Choose exactly one login mode: --api-key, --console, or --open-api";
1011

@@ -110,12 +111,26 @@ export default defineCommand({
110111

111112
if (flags.openApi) {
112113
if (settings.dryRun) {
113-
emitBare("Would save OpenAPI AK/SK credentials.");
114+
emitBare("Would save OpenAPI AK/SK credentials and generate CLI access token.");
114115
return;
115116
}
117+
const resolvedBaseUrl = store.resolveBaseUrl();
118+
process.stderr.write("Generating CLI access token... ");
119+
const resp = await generateCLIAccessToken({
120+
identity,
121+
settings,
122+
baseUrl: resolvedBaseUrl,
123+
accessKeyId: flags.accessKeyId!,
124+
accessKeySecret: flags.accessKeySecret!,
125+
});
126+
console.log(resp);
127+
process.stderr.write("Done\n");
128+
const accessToken =
129+
typeof resp.Data?.AccessToken === "string" ? resp.Data.AccessToken : undefined;
116130
await store.login({
117131
access_key_id: flags.accessKeyId,
118132
access_key_secret: flags.accessKeySecret,
133+
access_token: accessToken,
119134
});
120135
process.stderr.write(`OpenAPI credentials saved to ${getConfigPath()}\n`);
121136
return;

0 commit comments

Comments
 (0)