Basi c аутентификация и передача токена на следующую конечную точку - PullRequest
0 голосов
/ 18 марта 2020

Я новичок в аутентификации и токенах basi c.

Я играл с почтальоном, чтобы получить токен с использованием аутентификации basi c, а затем передать токен в качестве токена-носителя. получить доступ к другой конечной точке. Я хотел знать, как я буду кодировать это в вызовы API, используя узел и express.

Я знаю, что для Basi c auth мне нужно закодировать идентификатор клиента и секретный ключ в base64

curl --request POST \
--url http://localhost:8080/token/ \
--header 'authorization: Basic ***' \
--header 'content-type: application/x-www-form-urlencoded' \
--data 
         grant_type=credentials

Токен, который я получаю из вышеуказанного вызова, который я хочу передать на следующий call

curl --request POST \
--url http://localhost:8080/login \
--header 'authorization: Bearer ***' \
--header 'content-type: application/x-www-form-urlencoded' \
--data 
         user=1

Как бы это выглядело как код в приложении узла

1 Ответ

0 голосов
/ 18 марта 2020

Я бы порекомендовал json веб-токен aka jwt для этой цели.

Сейчас я пишу REST API в express, mongodb, и я использую jwt для аутентификации. Поскольку я не использую какой-либо каркас внешнего интерфейса или lib, я использую cook ie для хранения токенов jwt.

const jwt = require('jsonwebtoken');


const generateToken = (res, id, auth_level) => {

  const token = jwt.sign({id, 
                          auth_level
                        }, process.env.JWT_KEY, {
    expiresIn: '7d'
  });

  return res.cookie('token', token, {
    expires: new Date(Date.now() + 1000 * 60 * 15),
    secure: false, 
    httpOnly: true,
  });
};

module.exports = generateToken

В этом примере я вызываю эту функцию при успешной попытке входа в систему. И после этого при каждом доступе к маршруту, используя промежуточное ПО, я пытаюсь определить, есть ли у пользователя этот токен, и попытаться разрешить токен.

const jwt = require('jsonwebtoken');

// Verify user token from cookie
const verifyToken = async (req, res, next) => {

    // Get token from cookie named token
    const token = req.cookies.token || '';

    try {

        // Check if cookie exists, maybe expired maybe user didnt have one - no login
        if (!token) {
            return next();
        }

        // Decrypt users jwt token and get information
        const decrypt = await jwt.verify(token, process.env.JWT_KEY);

        // Pass that infomation to request user object
        req.user = {
            id: decrypt.id,
            auth_level: decrypt.auth_level,
            test: 'test'
        };

        // Continue with exectution of app
        return next();

    } catch (err) {

        return res.status(500).json(err.toString());

    }
};

module.exports = verifyToken;

Если этот токен действителен, я передаю пользовательский объект в объект req.

После этого я защищаю маршруты с помощью пользовательских промежуточных программ. Код вдохновлен этим учебником , рекомендую его.

...