Как передать JsonWebToken x-токен доступа через angular js

Я создал узел RESTful API с jsonwebtoken в качестве метода аутентификации. Но не удалось передать токен x-access-token в качестве заголовков с помощью angular js.

мой сценарий аутентификации токена 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."}

person LearnCode Master    schedule 27.04.2016    source источник
comment
Вы искали это раньше и что вы получили?   -  person Max Peng    schedule 27.04.2016
comment
@jicks Не могли бы вы показать свой угловой маршрут?   -  person Sk Arif    schedule 27.04.2016


Ответы (3)


Если вы используете $http в качестве зависимости в своем угловом контроллере, я думаю, это поможет вам -

var token = this.AuthToken.getToken();
$http.get('/api/me', { headers: {'x-access-token': token} });

Я изменю это в соответствии с вашим кодом, как только вы загрузите свой угловой код.

person Sk Arif    schedule 27.04.2016
comment
Но это не полностью угловой код. Я использовал угловой js-скрипт в узле js для передачи x-access-token в качестве заголовка. - person LearnCode Master; 27.04.2016
comment
Вы можете прочитать эту статью — using-json-web-tokens-node -js. Я думаю, это поможет вам получить некоторую информацию о том, что вы ищете. - person Sk Arif; 27.04.2016
comment
Тем не менее я не понял, как передать заголовок. @Sk Arif - person LearnCode Master; 28.04.2016

Клиент должен отправлять токен в заголовке Authorization, используя схему Bearer, поскольку заголовки «X-» устарели с 2012 года:

Теперь ваш узел будет выглядеть следующим образом:

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);
    ....
}

Тогда ваш угловой код станет:

var token = this.AuthToken.getToken();
$http.get('/api/me', { headers: {'Authorization': token} });
person mattyb    schedule 18.10.2016
comment
Не все герои носят плащи, но это новый способ двигаться вперед? - person CalebC; 01.03.2017

Вы можете создать перехватчик, который перехватывает все вызовы ajax и вставляет токен в заголовок. Таким образом, вы бы не вводили его каждый раз, когда делаете вызов ajax.

Это хорошее место для начала, если вы хотите пойти по этому пути: http://www.webdeeasy.com/interceptors-in-angularjs-and-useful-examples/

person jaredmahan    schedule 19.10.2016