如何通过angular js传递JsonWebToken x-access-token
How to pass JsonWebToken x-access-token through angular js
我使用 jsonwebtoken 作为身份验证方法创建了一个节点表达式 RESTful API。但是无法使用 angular js.
将 x-access-token 作为 headers 传递
我的 JWT 令牌身份验证脚本是,
apps.post('/authenticate', function(req, res) {
// find the item
Item.findOne({
name: req.body.name
}, function(err, item) {
if (err) throw err;
if (!item)
{
res.json({ success: false, message: 'Authentication failed. item not found.' });
}
else if (item)
{
// check if password matches
if (item.password != req.body.password)
{
res.json({ success: false, message: 'Authentication failed. Wrong password.' });
}
else
{
// if item is found and password is right
// create a token
var token = jwt.sign(item, app.get('superSecret'), {
expiresIn: 86400 // expires in 24 hours
});
res.json({
success: true,
message: 'Enjoy your token!',
token: token
});
}
}
});
});
检查令牌是否正确的中间件是,
apps.use(function(req, res, next) {
// check header or url parameters or post parameters for token
var token = req.body.token || req.params.token || req.headers['x-access-token'];
// decode token
if (token)
{
// verifies secret and checks exp
jwt.verify(token, app.get('superSecret'), function(err, decoded) {
if (err)
{
return res.json({ success: false, message: 'Failed to authenticate token.' });
}
else
{
// if everything is good, save to request for use in other routes
req.decoded = decoded;
next();
}
});
}
else
{
// if there is no token
// return an error
return res.status(403).send({
success: false,
message: 'No token provided.'
});
}
});
最后的 GET 方法脚本是,
app.get('/display', function(req, res) {
Item.find({}, function(err, items) {
$http.defaults.headers.common['X-Access-Token']=token;
res.json(items);
});
});
但是总是验证失败。请任何人帮助我解决这个问题。我真的卡在这里了。
它始终只显示以下身份验证失败消息。
{"success":false,"message":"No token provided."}
如果您在 angular 控制器中使用 $http 作为依赖项,那么我猜这会对您有所帮助 -
var token = this.AuthToken.getToken();
$http.get('/api/me', { headers: {'x-access-token': token} });
上传 angular 代码后,我会根据您的代码进行更改。
客户端应使用 Bearer 方案在授权 header 中发送令牌,因为自 2012 年以来 'X-' headers 已被弃用:
您的节点现在应该是:
apps.post('/authenticate', function(req, res) {
.....
var token = 'Bearer' + ' ' + jwt.sign(item, app.get('superSecret'), {
expiresIn: 86400 // expires in 24 hours
});
.....
}
apps.use(function(req, res, next) {
// Trim out the bearer text using substring
var token = req.get('Authorization').substring(7);
....
}
那么您的 angular 代码将变为:
var token = this.AuthToken.getToken();
$http.get('/api/me', { headers: {'Authorization': token} });
您可以创建一个拦截器来捕获所有 ajax 调用并将令牌注入 header。这样你就不会在每次调用 ajax 时都注入它。
如果您想走那条路,这是一个很好的起点:
http://www.webdeveasy.com/interceptors-in-angularjs-and-useful-examples/
我使用 jsonwebtoken 作为身份验证方法创建了一个节点表达式 RESTful API。但是无法使用 angular js.
将 x-access-token 作为 headers 传递我的 JWT 令牌身份验证脚本是,
apps.post('/authenticate', function(req, res) {
// find the item
Item.findOne({
name: req.body.name
}, function(err, item) {
if (err) throw err;
if (!item)
{
res.json({ success: false, message: 'Authentication failed. item not found.' });
}
else if (item)
{
// check if password matches
if (item.password != req.body.password)
{
res.json({ success: false, message: 'Authentication failed. Wrong password.' });
}
else
{
// if item is found and password is right
// create a token
var token = jwt.sign(item, app.get('superSecret'), {
expiresIn: 86400 // expires in 24 hours
});
res.json({
success: true,
message: 'Enjoy your token!',
token: token
});
}
}
});
});
检查令牌是否正确的中间件是,
apps.use(function(req, res, next) {
// check header or url parameters or post parameters for token
var token = req.body.token || req.params.token || req.headers['x-access-token'];
// decode token
if (token)
{
// verifies secret and checks exp
jwt.verify(token, app.get('superSecret'), function(err, decoded) {
if (err)
{
return res.json({ success: false, message: 'Failed to authenticate token.' });
}
else
{
// if everything is good, save to request for use in other routes
req.decoded = decoded;
next();
}
});
}
else
{
// if there is no token
// return an error
return res.status(403).send({
success: false,
message: 'No token provided.'
});
}
});
最后的 GET 方法脚本是,
app.get('/display', function(req, res) {
Item.find({}, function(err, items) {
$http.defaults.headers.common['X-Access-Token']=token;
res.json(items);
});
});
但是总是验证失败。请任何人帮助我解决这个问题。我真的卡在这里了。
它始终只显示以下身份验证失败消息。
{"success":false,"message":"No token provided."}
如果您在 angular 控制器中使用 $http 作为依赖项,那么我猜这会对您有所帮助 -
var token = this.AuthToken.getToken();
$http.get('/api/me', { headers: {'x-access-token': token} });
上传 angular 代码后,我会根据您的代码进行更改。
客户端应使用 Bearer 方案在授权 header 中发送令牌,因为自 2012 年以来 'X-' headers 已被弃用:
您的节点现在应该是:
apps.post('/authenticate', function(req, res) {
.....
var token = 'Bearer' + ' ' + jwt.sign(item, app.get('superSecret'), {
expiresIn: 86400 // expires in 24 hours
});
.....
}
apps.use(function(req, res, next) {
// Trim out the bearer text using substring
var token = req.get('Authorization').substring(7);
....
}
那么您的 angular 代码将变为:
var token = this.AuthToken.getToken();
$http.get('/api/me', { headers: {'Authorization': token} });
您可以创建一个拦截器来捕获所有 ajax 调用并将令牌注入 header。这样你就不会在每次调用 ajax 时都注入它。
如果您想走那条路,这是一个很好的起点: http://www.webdeveasy.com/interceptors-in-angularjs-and-useful-examples/