Skip to content

Commit 307dc3f

Browse files
authored
chore(backend): Rename M2M namespace from m2mTokens to m2m in api client (#6544)
1 parent d400782 commit 307dc3f

File tree

7 files changed

+51
-160
lines changed

7 files changed

+51
-160
lines changed

.changeset/serious-chicken-report.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
---
2+
"@clerk/backend": minor
3+
---
4+
5+
Rename M2M namespace from `m2mTokens` to `m2m` in Backend API client
6+
7+
Before:
8+
9+
```ts
10+
clerkClient.m2mTokens.create()
11+
12+
clerkClient.m2mTokens.revoke()
13+
14+
clerkClient.m2mTokens.verifySecret({ secret: 'ak_xxx' })
15+
```
16+
17+
After:
18+
19+
```ts
20+
clerkClient.m2m.createToken()
21+
22+
clerkClient.m2m.revokeToken()
23+
24+
clerkClient.m2m.verifyToken({ token: 'ak_xxx' })
25+
```
26+
27+
The `verifySecret()` method is removed. Please use `.verifyToken()` instead.

integration/tests/machine-auth/m2m.test.ts

Lines changed: 7 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -43,18 +43,7 @@ test.describe('machine-to-machine auth @machine', () => {
4343
const token = req.get('Authorization')?.split(' ')[1];
4444
4545
try {
46-
const m2mToken = await clerkClient.m2mTokens.verifyToken({ token });
47-
res.send('Protected response ' + m2mToken.id);
48-
} catch {
49-
res.status(401).send('Unauthorized');
50-
}
51-
});
52-
53-
app.get('/api/protected-deprecated', async (req, res) => {
54-
const secret = req.get('Authorization')?.split(' ')[1];
55-
56-
try {
57-
const m2mToken = await clerkClient.m2mTokens.verifySecret({ secret });
46+
const m2mToken = await clerkClient.m2m.verifyToken({ token });
5847
res.send('Protected response ' + m2mToken.id);
5948
} catch {
6049
res.status(401).send('Unauthorized');
@@ -81,7 +70,7 @@ test.describe('machine-to-machine auth @machine', () => {
8170
name: `${fakeCompanyName} Email Server`,
8271
scopedMachines: [primaryApiServer.id],
8372
});
84-
emailServerM2MToken = await client.m2mTokens.create({
73+
emailServerM2MToken = await client.m2m.createToken({
8574
machineSecretKey: emailServer.secretKey,
8675
secondsUntilExpiration: 60 * 30,
8776
});
@@ -91,7 +80,7 @@ test.describe('machine-to-machine auth @machine', () => {
9180
name: `${fakeCompanyName} Analytics Server`,
9281
// No scoped machines
9382
});
94-
analyticsServerM2MToken = await client.m2mTokens.create({
83+
analyticsServerM2MToken = await client.m2m.createToken({
9584
machineSecretKey: analyticsServer.secretKey,
9685
secondsUntilExpiration: 60 * 30,
9786
});
@@ -102,10 +91,10 @@ test.describe('machine-to-machine auth @machine', () => {
10291
secretKey: instanceKeys.get('with-api-keys').sk,
10392
});
10493

105-
await client.m2mTokens.revoke({
94+
await client.m2m.revokeToken({
10695
m2mTokenId: emailServerM2MToken.id,
10796
});
108-
await client.m2mTokens.revoke({
97+
await client.m2m.revokeToken({
10998
m2mTokenId: analyticsServerM2MToken.id,
11099
});
111100
await client.machines.delete(emailServer.id);
@@ -164,7 +153,7 @@ test.describe('machine-to-machine auth @machine', () => {
164153

165154
// Analytics server can access primary API server after adding scope
166155
await u.services.clerk.machines.createScope(analyticsServer.id, primaryApiServer.id);
167-
const m2mToken = await u.services.clerk.m2mTokens.create({
156+
const m2mToken = await u.services.clerk.m2m.createToken({
168157
machineSecretKey: analyticsServer.secretKey,
169158
secondsUntilExpiration: 60 * 30,
170159
});
@@ -176,21 +165,8 @@ test.describe('machine-to-machine auth @machine', () => {
176165
});
177166
expect(res2.status()).toBe(200);
178167
expect(await res2.text()).toBe('Protected response ' + m2mToken.id);
179-
await u.services.clerk.m2mTokens.revoke({
168+
await u.services.clerk.m2m.revokeToken({
180169
m2mTokenId: m2mToken.id,
181170
});
182171
});
183-
184-
test('authorizes M2M requests with deprecated verifySecret method', async ({ page, context }) => {
185-
const u = createTestUtils({ app, page, context });
186-
187-
// Email server can access primary API server
188-
const res = await u.page.request.get(app.serverUrl + '/api/protected-deprecated', {
189-
headers: {
190-
Authorization: `Bearer ${emailServerM2MToken.token}`,
191-
},
192-
});
193-
expect(res.status()).toBe(200);
194-
expect(await res.text()).toBe('Protected response ' + emailServerM2MToken.id);
195-
});
196172
});

packages/backend/src/api/__tests__/M2MTokenApi.test.ts

Lines changed: 10 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ describe('M2MToken', () => {
4040
),
4141
);
4242

43-
const response = await apiClient.m2mTokens.create({
43+
const response = await apiClient.m2m.createToken({
4444
secondsUntilExpiration: 3600,
4545
});
4646

@@ -65,7 +65,7 @@ describe('M2MToken', () => {
6565
),
6666
);
6767

68-
const response = await apiClient.m2mTokens.create({
68+
const response = await apiClient.m2m.createToken({
6969
machineSecretKey: 'ak_xxxxx',
7070
secondsUntilExpiration: 3600,
7171
});
@@ -102,7 +102,7 @@ describe('M2MToken', () => {
102102
),
103103
);
104104

105-
const errResponse = await apiClient.m2mTokens.create().catch(err => err);
105+
const errResponse = await apiClient.m2m.createToken().catch(err => err);
106106

107107
expect(errResponse.status).toBe(401);
108108
expect(errResponse.errors[0].code).toBe('machine_secret_key_invalid');
@@ -143,7 +143,7 @@ describe('M2MToken', () => {
143143
),
144144
);
145145

146-
const response = await apiClient.m2mTokens.revoke({
146+
const response = await apiClient.m2m.revokeToken({
147147
m2mTokenId: m2mId,
148148
revocationReason: 'revoked by test',
149149
});
@@ -171,7 +171,7 @@ describe('M2MToken', () => {
171171
),
172172
);
173173

174-
const response = await apiClient.m2mTokens.revoke({
174+
const response = await apiClient.m2m.revokeToken({
175175
m2mTokenId: m2mId,
176176
revocationReason: 'revoked by test',
177177
});
@@ -195,8 +195,8 @@ describe('M2MToken', () => {
195195
),
196196
);
197197

198-
const errResponse = await apiClient.m2mTokens
199-
.revoke({
198+
const errResponse = await apiClient.m2m
199+
.revokeToken({
200200
m2mTokenId: m2mId,
201201
revocationReason: 'revoked by test',
202202
})
@@ -223,7 +223,7 @@ describe('M2MToken', () => {
223223
),
224224
);
225225

226-
const response = await apiClient.m2mTokens.verifyToken({
226+
const response = await apiClient.m2m.verifyToken({
227227
token: m2mSecret,
228228
});
229229

@@ -249,7 +249,7 @@ describe('M2MToken', () => {
249249
),
250250
);
251251

252-
const response = await apiClient.m2mTokens.verifyToken({
252+
const response = await apiClient.m2m.verifyToken({
253253
token: m2mSecret,
254254
});
255255

@@ -273,7 +273,7 @@ describe('M2MToken', () => {
273273
),
274274
);
275275

276-
const errResponse = await apiClient.m2mTokens
276+
const errResponse = await apiClient.m2m
277277
.verifyToken({
278278
token: m2mSecret,
279279
})
@@ -282,81 +282,4 @@ describe('M2MToken', () => {
282282
expect(errResponse.status).toBe(401);
283283
});
284284
});
285-
286-
describe('verifySecret (deprecated)', () => {
287-
it('verifies a m2m token using machine secret', async () => {
288-
const apiClient = createBackendApiClient({
289-
apiUrl: 'https://api.clerk.test',
290-
machineSecretKey: 'ak_xxxxx',
291-
});
292-
293-
server.use(
294-
http.post(
295-
'https://api.clerk.test/m2m_tokens/verify',
296-
validateHeaders(({ request }) => {
297-
expect(request.headers.get('Authorization')).toBe('Bearer ak_xxxxx');
298-
return HttpResponse.json(mockM2MToken);
299-
}),
300-
),
301-
);
302-
303-
const response = await apiClient.m2mTokens.verifySecret({
304-
secret: m2mSecret,
305-
});
306-
307-
expect(response.id).toBe(m2mId);
308-
expect(response.token).toBe(m2mSecret);
309-
expect(response.scopes).toEqual(['mch_1xxxxx', 'mch_2xxxxx']);
310-
expect(response.claims).toEqual({ foo: 'bar' });
311-
});
312-
313-
it('verifies a m2m token using instance secret', async () => {
314-
const apiClient = createBackendApiClient({
315-
apiUrl: 'https://api.clerk.test',
316-
secretKey: 'sk_xxxxx',
317-
});
318-
319-
server.use(
320-
http.post(
321-
'https://api.clerk.test/m2m_tokens/verify',
322-
validateHeaders(({ request }) => {
323-
expect(request.headers.get('Authorization')).toBe('Bearer sk_xxxxx');
324-
return HttpResponse.json(mockM2MToken);
325-
}),
326-
),
327-
);
328-
329-
const response = await apiClient.m2mTokens.verifySecret({
330-
secret: m2mSecret,
331-
});
332-
333-
expect(response.id).toBe(m2mId);
334-
expect(response.token).toBe(m2mSecret);
335-
expect(response.scopes).toEqual(['mch_1xxxxx', 'mch_2xxxxx']);
336-
expect(response.claims).toEqual({ foo: 'bar' });
337-
});
338-
339-
it('requires a machine secret or instance secret to verify a m2m token', async () => {
340-
const apiClient = createBackendApiClient({
341-
apiUrl: 'https://api.clerk.test',
342-
});
343-
344-
server.use(
345-
http.post(
346-
'https://api.clerk.test/m2m_tokens/verify',
347-
validateHeaders(() => {
348-
return HttpResponse.json(mockM2MToken);
349-
}),
350-
),
351-
);
352-
353-
const errResponse = await apiClient.m2mTokens
354-
.verifySecret({
355-
secret: m2mSecret,
356-
})
357-
.catch(err => err);
358-
359-
expect(errResponse.status).toBe(401);
360-
});
361-
});
362285
});

packages/backend/src/api/__tests__/factory.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ describe('api.client', () => {
325325
),
326326
);
327327

328-
const response = await apiClient.m2mTokens.verifyToken({
328+
const response = await apiClient.m2m.verifyToken({
329329
machineSecretKey: 'ak_test_in_header_params', // this will be added to headerParams.Authorization
330330
token: 'mt_secret_test',
331331
});
@@ -353,7 +353,7 @@ describe('api.client', () => {
353353
),
354354
);
355355

356-
const response = await apiClient.m2mTokens.verifyToken({
356+
const response = await apiClient.m2m.verifyToken({
357357
token: 'mt_secret_test',
358358
});
359359
expect(response.id).toBe('mt_test');
@@ -425,7 +425,7 @@ describe('api.client', () => {
425425
),
426426
);
427427

428-
const response = await apiClient.m2mTokens.verifyToken({
428+
const response = await apiClient.m2m.verifyToken({
429429
token: 'mt_secret_test',
430430
});
431431
expect(response.id).toBe('mt_test');

packages/backend/src/api/endpoints/M2MTokenApi.ts

Lines changed: 2 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import { deprecated } from '@clerk/shared/deprecated';
2-
31
import { joinPaths } from '../../util/path';
42
import type { ClerkBackendApiRequestOptions } from '../request';
53
import type { M2MToken } from '../resources/M2MToken';
@@ -33,17 +31,6 @@ type RevokeM2MTokenParams = {
3331
revocationReason?: string | null;
3432
};
3533

36-
type VerifyM2MTokenParamsDeprecated = {
37-
/**
38-
* Custom machine secret key for authentication.
39-
*/
40-
machineSecretKey?: string;
41-
/**
42-
* Machine-to-machine token secret to verify.
43-
*/
44-
secret: string;
45-
};
46-
4734
type VerifyM2MTokenParams = {
4835
/**
4936
* Custom machine secret key for authentication.
@@ -70,7 +57,7 @@ export class M2MTokenApi extends AbstractAPI {
7057
return options;
7158
}
7259

73-
async create(params?: CreateM2MTokenParams) {
60+
async createToken(params?: CreateM2MTokenParams) {
7461
const { claims = null, machineSecretKey, secondsUntilExpiration = null } = params || {};
7562

7663
const requestOptions = this.#createRequestOptions(
@@ -88,7 +75,7 @@ export class M2MTokenApi extends AbstractAPI {
8875
return this.request<M2MToken>(requestOptions);
8976
}
9077

91-
async revoke(params: RevokeM2MTokenParams) {
78+
async revokeToken(params: RevokeM2MTokenParams) {
9279
const { m2mTokenId, revocationReason = null, machineSecretKey } = params;
9380

9481
this.requireId(m2mTokenId);
@@ -107,28 +94,6 @@ export class M2MTokenApi extends AbstractAPI {
10794
return this.request<M2MToken>(requestOptions);
10895
}
10996

110-
/**
111-
* Verify a machine-to-machine token.
112-
*
113-
* @deprecated Use {@link verifyToken} instead.
114-
*/
115-
async verifySecret(params: VerifyM2MTokenParamsDeprecated) {
116-
const { secret, machineSecretKey } = params;
117-
118-
deprecated('verifySecret', 'Use `verifyToken({ token: mt_xxx })` instead');
119-
120-
const requestOptions = this.#createRequestOptions(
121-
{
122-
method: 'POST',
123-
path: joinPaths(basePath, 'verify'),
124-
bodyParams: { secret },
125-
},
126-
machineSecretKey,
127-
);
128-
129-
return this.request<M2MToken>(requestOptions);
130-
}
131-
13297
async verifyToken(params: VerifyM2MTokenParams) {
13398
const { token, machineSecretKey } = params;
13499

packages/backend/src/api/factory.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ export function createBackendApiClient(options: CreateBackendApiOptions) {
7272
jwks: new JwksAPI(request),
7373
jwtTemplates: new JwtTemplatesApi(request),
7474
machines: new MachineApi(request),
75-
m2mTokens: new M2MTokenApi(
75+
m2m: new M2MTokenApi(
7676
buildRequest({
7777
...options,
7878
skipApiVersionInUrl: true,

packages/backend/src/tokens/verify.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ async function verifyM2MToken(
206206
): Promise<MachineTokenReturnType<M2MToken, MachineTokenVerificationError>> {
207207
try {
208208
const client = createBackendApiClient(options);
209-
const verifiedToken = await client.m2mTokens.verifyToken({ token });
209+
const verifiedToken = await client.m2m.verifyToken({ token });
210210
return { data: verifiedToken, tokenType: TokenType.M2MToken, errors: undefined };
211211
} catch (err: any) {
212212
return handleClerkAPIError(TokenType.M2MToken, err, 'Machine token not found');

0 commit comments

Comments
 (0)