Soy nuevo en Node, así que espero su ayuda ... Estoy trabajando en la aplicación MEAN stack e intento implementar el sistema de autenticación por pasaporte-jwt. Los formularios y páginas de registro/inicio de sesión funcionan correctamente y puedo acceder al token y almacenarlo en el almacenamiento local, pero cuando intento acceder al perfil de usuario después de iniciar sesión, aparece el siguiente error: 401 (no autorizado) .
Parece que no estoy enviando correctamente el token al servidor porque a través del cartero con el token del almacenamiento local todo funciona.
Aquí está mi código ..
Error
HttpErrorResponse {headers: HttpHeaders, status: 401, statusText: 'Unauthorized', url: 'http://localhost:3000/users/profile', ok: false, …} error: "Unauthorized" headers: HttpHeaders {normalizedNames: Map(0), lazyUpdate: null, headers: Map(0)} message: "Http failure response for http://localhost:3000/users/profile: 401 Unauthorized" name: "HttpErrorResponse" ok: false status: 401 statusText: "Unauthorized" url: "http://localhost:3000/users/profile"Pasaporte.js
const JwtStrategy = require('passport-jwt').Strategy; const ExtractJwt = require('passport-jwt').ExtractJwt; const User = require('../models/user'); const config = require('./db.config'); module.exports = function(passport) { let opts = {}; opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme("jwt") opts.secretOrKey = config.secret; passport.use(new JwtStrategy(opts, (jwt_payload, done) => { User.getUserById(jwt_payload._id, (err, user) => { if(err) { return done(err, false); } if(user) { return done(null, user); } else{ return done(null, false); } }) })) }Nodo ruta.js
router.get('/profile', passport.authenticate('jwt', {session: false}), (req, res, next) => { res.json({user: req.user}) });Servicio de autenticación
getProfile() { let headers = new HttpHeaders(); this.loadToken(); headers.append('Authorization', this.authToken); headers.append('Content-Type', 'application/json'); return this.http.get('http://localhost:3000/users/profile', {headers: headers}) .pipe(map((res: any) => res)); } loadToken() { const token = localStorage.getItem('id_token'); this.authToken = token; }Profile.ts aquí llamo al servicio de autenticación y luego obtengo un error
constructor(private auth: AuthService) { } ngOnInit() { this.auth.getProfile().subscribe(profile => { this.user = profile.user; }, err => { console.log(err); return false; }); }Gracias por adelantado :)
Encontré la solución. Pasé mucho tiempo antes de publicar esta pregunta, por lo que para las personas que se encontraron con el mismo problema, la mejor manera será crear un interceptor:
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { const idToken = localStorage.getItem('id_token'); if(idToken) { const cloned = req.clone({ headers: req.headers.set('Authorization', idToken) }); return next.handle(cloned) } else { return next.handle(req); }