Skip to content

Commit 7d37805

Browse files
committed
fix(fetch): use _CLIENT_SECRET suffix when reading OAuth secret from env
The write path stores secrets as AGENTCORE_CREDENTIAL_{NAME}_CLIENT_SECRET but the read path was looking for AGENTCORE_CREDENTIAL_{NAME} without the suffix, causing token fetch to always fail with "Client secret not found".
1 parent 1f4a3a5 commit 7d37805

3 files changed

Lines changed: 14 additions & 13 deletions

File tree

src/cli/operations/fetch-access/__tests__/fetch-gateway-token.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ describe('fetchGatewayToken', () => {
138138
describe('auth type CUSTOM_JWT', () => {
139139
beforeEach(() => {
140140
vi.mocked(readEnvFile).mockResolvedValue({
141-
AGENTCORE_CREDENTIAL_MYGATEWAY_OAUTH: 'test-secret',
141+
AGENTCORE_CREDENTIAL_MYGATEWAY_OAUTH_CLIENT_SECRET: 'test-secret',
142142
AGENTCORE_CREDENTIAL_MYGATEWAY_OAUTH_CLIENT_ID: 'test-client',
143143
});
144144

@@ -170,7 +170,7 @@ describe('fetchGatewayToken', () => {
170170

171171
it('uses tier 2 CLIENT_ID env var when set', async () => {
172172
vi.mocked(readEnvFile).mockResolvedValue({
173-
AGENTCORE_CREDENTIAL_MYGATEWAY_OAUTH: 'test-secret',
173+
AGENTCORE_CREDENTIAL_MYGATEWAY_OAUTH_CLIENT_SECRET: 'test-secret',
174174
AGENTCORE_CREDENTIAL_MYGATEWAY_OAUTH_CLIENT_ID: 'tier2-client',
175175
});
176176

@@ -187,7 +187,7 @@ describe('fetchGatewayToken', () => {
187187

188188
it('falls back to tier 3 allowedClients[0] when no CLIENT_ID env var', async () => {
189189
vi.mocked(readEnvFile).mockResolvedValue({
190-
AGENTCORE_CREDENTIAL_MYGATEWAY_OAUTH: 'test-secret',
190+
AGENTCORE_CREDENTIAL_MYGATEWAY_OAUTH_CLIENT_SECRET: 'test-secret',
191191
});
192192

193193
const projectSpecWithFallbackClient = {
@@ -296,7 +296,7 @@ describe('fetchGatewayToken', () => {
296296

297297
it('throws when client_id is not resolvable', async () => {
298298
vi.mocked(readEnvFile).mockResolvedValue({
299-
AGENTCORE_CREDENTIAL_MYGATEWAY_OAUTH: 'test-secret',
299+
AGENTCORE_CREDENTIAL_MYGATEWAY_OAUTH_CLIENT_SECRET: 'test-secret',
300300
// no CLIENT_ID env var
301301
});
302302

@@ -326,7 +326,7 @@ describe('fetchGatewayToken', () => {
326326

327327
it('throws when OIDC discovery returns non-ok response', async () => {
328328
vi.mocked(readEnvFile).mockResolvedValue({
329-
AGENTCORE_CREDENTIAL_MYGATEWAY_OAUTH: 'test-secret',
329+
AGENTCORE_CREDENTIAL_MYGATEWAY_OAUTH_CLIENT_SECRET: 'test-secret',
330330
AGENTCORE_CREDENTIAL_MYGATEWAY_OAUTH_CLIENT_ID: 'test-client',
331331
});
332332

@@ -345,7 +345,7 @@ describe('fetchGatewayToken', () => {
345345

346346
it('throws with status and error body when token request fails', async () => {
347347
vi.mocked(readEnvFile).mockResolvedValue({
348-
AGENTCORE_CREDENTIAL_MYGATEWAY_OAUTH: 'test-secret',
348+
AGENTCORE_CREDENTIAL_MYGATEWAY_OAUTH_CLIENT_SECRET: 'test-secret',
349349
AGENTCORE_CREDENTIAL_MYGATEWAY_OAUTH_CLIENT_ID: 'test-client',
350350
});
351351

src/cli/operations/fetch-access/fetch-runtime-token.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ export async function canFetchRuntimeToken(
3030
);
3131
if (!hasCredential) return false;
3232

33-
const secretEnvVar = computeDefaultCredentialEnvVarName(credName);
33+
const envVarPrefix = computeDefaultCredentialEnvVarName(credName);
3434
const envVars = await readEnvFile();
35-
return !!envVars[secretEnvVar];
35+
return !!envVars[`${envVarPrefix}_CLIENT_SECRET`];
3636
} catch {
3737
return false;
3838
}

src/cli/operations/fetch-access/oauth-token.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ export async function fetchOAuthToken(opts: {
4646
}
4747

4848
// Resolve client_secret from .env.local
49-
const secretEnvVar = computeDefaultCredentialEnvVarName(credName);
49+
const envVarPrefix = computeDefaultCredentialEnvVarName(credName);
50+
const secretEnvVar = `${envVarPrefix}_CLIENT_SECRET`;
5051
const envVars = await readEnvFile();
5152
const clientSecret = envVars[secretEnvVar];
5253
if (!clientSecret) {
@@ -56,7 +57,7 @@ export async function fetchOAuthToken(opts: {
5657
}
5758

5859
// Resolve client_id using 3-tier fallback
59-
const clientId = resolveClientId(deployedState, targetName, credName, secretEnvVar, envVars, jwtConfig);
60+
const clientId = resolveClientId(deployedState, targetName, credName, envVarPrefix, envVars, jwtConfig);
6061
if (!clientId) {
6162
throw new Error(
6263
`Could not determine OAuth client ID for '${resourceName}'. Ensure the resource was created with --client-id.`
@@ -140,7 +141,7 @@ function resolveClientId(
140141
deployedState: DeployedState,
141142
targetName: string,
142143
credName: string,
143-
secretEnvVar: string,
144+
envVarPrefix: string,
144145
envVars: Record<string, string>,
145146
jwtConfig: { allowedClients?: string[] }
146147
): string | undefined {
@@ -150,8 +151,8 @@ function resolveClientId(
150151
return (deployedCred as Record<string, string>).clientId;
151152
}
152153

153-
// Tier 2: env var ${secretEnvVar}_CLIENT_ID
154-
const clientIdEnvVar = `${secretEnvVar}_CLIENT_ID`;
154+
// Tier 2: env var ${envVarPrefix}_CLIENT_ID
155+
const clientIdEnvVar = `${envVarPrefix}_CLIENT_ID`;
155156
const envClientId = envVars[clientIdEnvVar];
156157
if (envClientId) {
157158
return envClientId;

0 commit comments

Comments
 (0)