/ / cb n'est pas une fonction dans hapi-auth-jwt2 - Node.js - javascript, node.js, jwt, reposful-authentication, hapijs

cb n'est pas une fonction dans hapi-auth-jwt2 - Node.js - javascript, node.js, jwt, reposful-authentication, hapijs

Je suis ce tutoriel à mettre en place jwt authentication dans hapijs v17.2.

J'ai tout fait selon le tutoriel, mais l'erreur suivante me rend fou, même le débogage n'a apporté aucun changement.

Erreur

Debug: internal, implementation, error
TypeError: cb is not a function
at Object.secretProvider [as key] (C:UsersuserWebstormProjectshapi-blognode_modulesjwks-rsalibintegrationshapi.js:30:14)
at Object.authenticate (C:UsersuserWebstormProjectshapi-blognode_moduleshapi-auth-jwt2libindex.js:123:87)
at module.exports.internals.Manager.execute (C:UsersuserWebstormProjectshapi-blognode_moduleshapilibtoolkit.js:35:106)
at module.exports.internals.Auth._authenticate (C:UsersuserWebstormProjectshapi-blognode_moduleshapilibauth.js:242:58)
at authenticate (C:UsersuserWebstormProjectshapi-blognode_moduleshapilibauth.js:217:21)
at module.exports.internals.Request._lifecycle (C:UsersuserWebstormProjectshapi-blognode_moduleshapilibrequest.js:261:62)
at <anonymous>

app.js

const hapi = require("hapi");
const mongoose = require("./db");
const hapi_auth_jwt = require("hapi-auth-jwt2");
const jwksa_rsa = require("jwks-rsa");
const dog_controller = require("./controllers/dog");

const server = new hapi.Server({
host: "localhost",
port: 4200
});

const validate_user = (decoded, request, callback) => {
console.log("Decoded", decoded);
if (decoded && decoded.sub) {
return callback(null, true, {});
}

return callback(null, true, {});
};

const register_routes = () => {
server.route({
method: "GET",
path: "/dogs",
options: {
handler: dog_controller.list,
auth: false
}
});

// Test
server.route({
method: "POST",
path: "/a",
options: {
handler: (req, h) => {
return h.response({message: req.params.a});
},
auth: false
}
});

server.route({
method: "GET",
path: "/dogs/{id}",
options: {
handler: dog_controller.get
}
});

server.route({
method: "POST",
path: "/dogs",
options: {
handler: dog_controller.create
}
});

server.route({
method: "PUT",
path: "/dogs/{id}",
handler: dog_controller.update
});

server.route({
method: "DELETE",
path: "/dogs/{id}",
handler: dog_controller.remove
});
};

const init = async () => {
await server.register(hapi_auth_jwt);

server.auth.strategy("jwt", "jwt", {
key: jwksa_rsa.hapiJwt2Key({
cache: true,
rateLimit: true,
jwksRequestsPerMinute: 5,
// YOUR-AUTH0-DOMAIN name e.g https://prosper.auth0.com
jwksUri: "https://mrvar.auth0.com/.well-known/jwks.json"
}),
verifyOptions: {
audience: "https://mrvar.auth0.com/api/v2/",
issuer: "https://mrvar.auth0.com",
algorithm: ["RS256"]
},
validate: validate_user
});

server.auth.default("jwt");

// Register routes
register_routes();

// Start server
await server.start();

return server;
};

init().then(server => {
console.log("Server running at: ", server.info.uri);
}).catch(err => {
console.log(err);
});

Quand je fais une demande d'itinéraires avec auth: false, le gestionnaire fonctionne correctement, j’obtiens le résultat attendu, mais les demandes d’itinéraires sans auth renvoyer le json suivant:

{
"statusCode": 500,
"error": "Internal Server Error",
"message": "An internal server error occurred"
}

Plus d'informations:

version du noeud: 8.9.4

version npm: 5.6.0

version hapi: 17.2.0

hapi-auth-jwt2: github: salzhrani / hapi-auth-jwt2 # v-17

jwks-rsa: 1.2.1

mangouste: 5.0.6

nodemon: 1.15.0

Réponses:

1 pour la réponse № 1

La fonction de validation a été modifiée dans hapi @ 17 pour ne pas avoir de fonction de rappel. Basé sur votre exemple, il devrait maintenant ressembler à ceci:

const validate = async (decoded, request) => {
if (decoded && decoded.sub) {
return { isValid: true };
}
return { isValid: false );
};

Une partie de l'objet renvoyé peut également inclure credentials ce qui représenterait l'utilisateur authentifié et vous pouvez également créer une étendue dans le cadre des informations d'identification.

Ensuite, si vous le souhaitez, vous pouvez accéder aux identifiants dans le request objet comme request.auth.credentials