NodeJs:错误 401(未经授权),护照,jwt。平均堆栈、节点、快递、angular、猫鼬
NodeJs :Error 401(Unauthorized), passport, jwt. MEAN stack, node, express, angular, mongoose
我是 Node 的新手,希望对您有所帮助...
我在 MEAN stack 应用程序工作,并尝试通过 passport-jwt 实现身份验证系统。 Registration/login 表单和页面正在运行corectly,我可以访问令牌并将其存储在本地存储中,但是当我尝试在登录后访问用户配置文件时,我得到以下 Error: 401(Unauthorized).
我似乎没有正确地将令牌发送到服务器,因为通过邮递员使用来自本地存储的令牌一切正常。
这是我的代码..
错误
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"
Passport.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);
}
})
}))
}
节点route.js
router.get('/profile', passport.authenticate('jwt', {session: false}), (req, res, next) => {
res.json({user: req.user})
});
AuthService
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
在这里我调用 auth 服务然后得到错误
constructor(private auth: AuthService) { }
ngOnInit() {
this.auth.getProfile().subscribe(profile => {
this.user = profile.user;
},
err => {
console.log(err);
return false;
});
}
提前致谢:)
找到解决方案..
我在 post 这个问题之前花了很多时间,所以对于遇到同样问题的人来说,最好的方法是创建一个拦截器:
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);
}
我是 Node 的新手,希望对您有所帮助... 我在 MEAN stack 应用程序工作,并尝试通过 passport-jwt 实现身份验证系统。 Registration/login 表单和页面正在运行corectly,我可以访问令牌并将其存储在本地存储中,但是当我尝试在登录后访问用户配置文件时,我得到以下 Error: 401(Unauthorized).
我似乎没有正确地将令牌发送到服务器,因为通过邮递员使用来自本地存储的令牌一切正常。
这是我的代码..
错误
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"
Passport.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);
}
})
}))
}
节点route.js
router.get('/profile', passport.authenticate('jwt', {session: false}), (req, res, next) => {
res.json({user: req.user})
});
AuthService
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 在这里我调用 auth 服务然后得到错误
constructor(private auth: AuthService) { }
ngOnInit() {
this.auth.getProfile().subscribe(profile => {
this.user = profile.user;
},
err => {
console.log(err);
return false;
});
}
提前致谢:)
找到解决方案.. 我在 post 这个问题之前花了很多时间,所以对于遇到同样问题的人来说,最好的方法是创建一个拦截器:
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);
}