Estoy tratando de agregar un token de actualización a la función de inicio de sesión de strapi 4 cuando inicio sesión como usuario. He seguido este tutorial, que se realiza en v3. Enlace tutorial
Estoy usando las extensiones de Strapi 4 y modifiqué el archivo strapi-server.js en ==> src/extensions/users-permissions/strapi-server.js
Como se explica en el tutorial, copio/pego todas las funciones del controlador que se encuentran aquí (solo probé la devolución de llamada por el momento) strapi github repo
Cambié alguna ruta para que funcione el requerimiento, y la devolución de llamada funciona como antes cuando el usuario inicia sesión, y también obtengo mi versión de token 'tkv' y la identificación del token de actualización como en el tutorial.
Tengo 1 pregunta y 1 problema.
¿Hay alguna manera de evitar la duplicación de estas funciones básicas? Solo quiero agregar un token de actualización al resultado final.
He creado dos nuevas rutas para actualizar y revocar el token como se explica. Pero, incluso si doy las autorizaciones en el backend de strapi, sigo recibiendo un método "405" no permitido cuando llamo al punto final.
Algo que no entiendo es que en el archivo predeterminado de strapi-server.js, tenemos un código de demostración para la ruta.
// Original demo code in the existing strapi-server.js plugin.policies[newPolicy] = (ctx) => {}; plugin.routes.push({ method: 'GET', path: '/route-path', handler: 'controller.action', });Si presiono las nuevas rutas usando el ejemplo, aparece un error que dice que plugin.routes... no es una función
Si cambio las rutas así, las rutas se agregan correctamente:
plugin.routes['content-api'].routes.push({ method: 'POST', path: '/auth/refreshToken', handler: 'auth.refreshToken', },{ method: 'POST', path: '/auth/revokeToken', handler: 'auth.revokeToken', })Aquí, agrego mis rutas al backend, pero cuando miro los roles y permisos del backend de strapi, la ruta del punto final de los métodos es "/api/users-permissions/auth/refreshToken" o "/api/users-permissions/auth/ revocar token". No entiendo por qué se agrega el controlador.
Si llamo a estos puntos finales, obtengo un error 400. Si llamo a estos puntos finales eliminando los "permisos de usuarios" en la ruta del punto final, obtengo un 405.
No sé a dónde mirar, para corregir esto para obtener mis fichas. Gracias a todos por su ayuda.
Saludos,
Fabien
No estoy seguro, pero parece que las funciones principales deben replicarse
Código de trabajo para mí de la siguiente manera
plugin.controllers.auth['refreshToken'] = async (ctx) => { const params = _.assign(ctx.request.body); // Params should consist of: // * token - string - jwt refresh token // * renew - boolean - if true, also return an updated refresh token. // Parse Token try { // Unpack refresh token const {tkv, iat, exp, sub} = await strapi.plugins["users-permissions"].services.jwt.verify(params.token); // Check if refresh token has expired if (Date.now() / 1000 > exp) return ctx.badRequest(null, "Expired refresh token"); // fetch user based on subject const user = await strapi.query('plugin::users-permissions.user').findOne({where:{ id: sub }}); // Check here if user token version is the same as in refresh token // This will ensure that the refresh token hasn't been made invalid by a password change or similar. if (tkv !== user.tokenVersion) return ctx.badRequest(null, "Refresh token is invalid"); // Otherwise we are good to go. ctx.send({ jwt: strapi.plugins["users-permissions"].services.jwt.issue({ id: user.id, }), refresh: params.renew ? generateRefreshToken(user) : null }); } catch (e) { return ctx.badRequest(null, "Invalid token"); } } plugin.controllers.auth['revoke'] = async (ctx) => { const params = _.assign(ctx.request.body); const userService = getService('user'); // Params should consist of: // * token - string - jwt refresh token // Parse Token try { // Unpack refresh token const {tkv, iat, exp, sub} = await strapi.plugins["users-permissions"].services.jwt.verify(params.token); // Check if refresh token has expired if (Date.now() / 1000 > exp) return ctx.badRequest(null, "Expired refresh token"); // fetch user based on subject const user = await strapi.query('plugin::users-permissions.user').findOne({where:{ id: sub }}); // Check here if user token version is the same as in refresh token // This will ensure that the refresh token hasn't been made invalid by a password change or similar. if (tkv !== user.tokenVersion) return ctx.badRequest(null, "Refresh token is invalid"); // Update the user. const tokenVersion = user.tokenVersion + 1; await userService.edit(sub, { tokenVersion: tokenVersion }); ctx.send({ confirmed: true, }); } catch (e) { return ctx.badRequest(null, "Invalid token"); } } plugin.routes['content-api'].routes.push({ "method": "POST", "path": "/auth/refreshToken", "handler": "auth.refreshToken", "config": { "policies": [], "prefix": "" } }); plugin.routes['content-api'].routes.push({ "method": "POST", "path": "/auth/revoke", "handler": "auth.revoke", "config": { "policies": [], "prefix": "" } });Llamar a /api/auth/refreshToken y /api/auth/revoke funciona bien después