@happykiller/sunny-mcp 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../src/resource/verifier.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;
|
|
1
|
+
{"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../src/resource/verifier.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AAG5F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,mBAAmB,GACxB,kBAAkB,CAiDpB"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
// for them as the intended audience ». Sans ce contrôle, un jeton obtenu pour
|
|
7
7
|
// n'importe quel autre service ouvrirait celui-ci.
|
|
8
8
|
import { createRemoteJWKSet, jwtVerify } from 'jose';
|
|
9
|
+
import { InvalidTokenError } from '@modelcontextprotocol/sdk/server/auth/errors.js';
|
|
9
10
|
import { silentLogger } from '../logger.js';
|
|
10
11
|
/**
|
|
11
12
|
* Vérificateur adossé au JWKS du serveur d'autorisation.
|
|
@@ -20,12 +21,28 @@ export function creerVerificateurJwks(opts) {
|
|
|
20
21
|
const jwks = createRemoteJWKSet(new URL(opts.jwksUri));
|
|
21
22
|
return {
|
|
22
23
|
async verifyAccessToken(token) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
// `jose` signale tout échec par une exception qui lui est propre :
|
|
25
|
+
// signature invalide, jeton illisible, expiration, audience étrangère.
|
|
26
|
+
// Le middleware du SDK ne sait traduire qu'`InvalidTokenError` en 401 ;
|
|
27
|
+
// toute autre exception ressort en 500, SANS en-tête `WWW-Authenticate`.
|
|
28
|
+
// La nuance n'est pas cosmétique : un client qui reçoit 500 conclut à une
|
|
29
|
+
// panne du serveur, là où un 401 lui dit de refaire son autorisation. Un
|
|
30
|
+
// jeton simplement expiré condamnerait donc la session au lieu de la
|
|
31
|
+
// renouveler.
|
|
32
|
+
let payload;
|
|
33
|
+
try {
|
|
34
|
+
({ payload } = await jwtVerify(token, jwks, {
|
|
35
|
+
issuer: opts.issuer,
|
|
36
|
+
// C'est LE contrôle qui compte. `jose` rejette le jeton si son `aud`
|
|
37
|
+
// ne contient pas cette valeur — donc s'il était destiné ailleurs.
|
|
38
|
+
audience: opts.resource,
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
catch (erreur) {
|
|
42
|
+
const motif = erreur instanceof Error ? erreur.message : 'jeton invalide';
|
|
43
|
+
logger.info(`jeton refusé — ${motif}`);
|
|
44
|
+
throw new InvalidTokenError(motif);
|
|
45
|
+
}
|
|
29
46
|
const scopes = String(payload.scope ?? '')
|
|
30
47
|
.split(' ')
|
|
31
48
|
.filter(Boolean);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../src/resource/verifier.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,oDAAoD;AACpD,EAAE;AACF,6EAA6E;AAC7E,+EAA+E;AAC/E,8EAA8E;AAC9E,mDAAmD;AACnD,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../src/resource/verifier.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,oDAAoD;AACpD,EAAE;AACF,6EAA6E;AAC7E,+EAA+E;AAC/E,8EAA8E;AAC9E,mDAAmD;AACnD,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAGrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iDAAiD,CAAC;AAGpF,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAY5C;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAyB;IAEzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC;IAC3C,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAEvD,OAAO;QACL,KAAK,CAAC,iBAAiB,CAAC,KAAa;YACnC,mEAAmE;YACnE,uEAAuE;YACvE,wEAAwE;YACxE,yEAAyE;YACzE,0EAA0E;YAC1E,yEAAyE;YACzE,qEAAqE;YACrE,cAAc;YACd,IAAI,OAAO,CAAC;YACZ,IAAI,CAAC;gBACH,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE;oBAC1C,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,qEAAqE;oBACrE,mEAAmE;oBACnE,QAAQ,EAAE,IAAI,CAAC,QAAQ;iBACxB,CAAC,CAAC,CAAC;YACN,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC;gBAChB,MAAM,KAAK,GACT,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC;gBAC9D,MAAM,CAAC,IAAI,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC;gBACvC,MAAM,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;iBACvC,KAAK,CAAC,GAAG,CAAC;iBACV,MAAM,CAAC,OAAO,CAAC,CAAC;YAEnB,MAAM,CAAC,IAAI,CACT,uBAAuB,OAAO,CAAC,GAAG,WAAW,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAC3E,CAAC;YAEF,OAAO;gBACL,KAAK;gBACL,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC;gBACxD,MAAM;gBACN,SAAS,EAAE,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;gBACpE,QAAQ,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAChC,qEAAqE;gBACrE,iEAAiE;gBACjE,KAAK,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;aAC5B,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@happykiller/sunny-mcp",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"description": "Socle MCP partagé : transport, session GraphQL, registre d'outils et garde-fous, pour exposer le back-office d'un produit aux agents.",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"repository": {
|