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 № 1La 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