Насколько это безопасно (также для CSRF), используя заголовок «Аутентификация» для ApiKey и $ localStorage для пользователя JWT token_access - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть сервер MyServer в Express, который предоставляет некоторые API для веб-приложений. Каждое WebApp имеет свой собственный сервер, который перенаправляет запросы на MyServer . Я ищу хороший способ управления как конечными пользователями, так и сторонней аутентификацией.

Сейчас я использую токены JWT в (AngularJS) $ localStorage для окончательной аутентификации пользователя и Аутентификация * заголовок с apikey для аутентификации клиента.

Для каждого запроса, который делает WebApp, локальный. js код читает токен из $ localStorage, добавляет его к запросу и отправляет его в сервер. Сервер добавляет ApiKey в заголовок и отправляет запрос на MyServer .

Когда пользователь регистрируется по электронной почте и паролю, сервер генерирует JWT, связанный с этим пользователем.

function createToken(user, role) {
    var usr = {
        role: role,      // admin | customer | shop
        email: user.email,
        name: user.name
    };

    var expires = (Date.now() / 1000) + 60 * 60 * 24 * 365; // 1 year
    var nbf = Date.now() / 1000;
    usr['nbf'] = nbf;
    usr['exp'] = expires;
    var token = jwts.encode(usr, process.env.SECRET);
    return token;
}

Когда Web-клиент получает этот токен, он сохраняет токен в $ localStorage и использует его для каждого вызова API на сервере, а также для автоматического входа в систему.

   /* store token in localstorage */   
    this.storeToken = function(user, token)
    {
     $localStorage['myapp'] =  {user: {
                                                token   : token,
                                                name    : user.name,
                                                id      : user.id,
                                                role    : user.role
                                               }
                                       };
     }

 /* retrieve token to make requests */   
  this.GET = function()
{
   var token = $localStorage['myapp'].user.token;
   var options  = {};
   options.headers = {'x-access-token':token};         
   $http.get('https://myserver.it/test_req', options)
       .then(/* ... */);
} 


Маркер также содержит role, поэтому, когда сервер получает запрос, он знает, может ли этот пользователь / роль получить доступ к запрашиваемому маршруту / ресурсу.

   // server verifies secret and checks exp
function checkToken(token, api_name) {
    jwt.verify(token, process.env.SECRET,
        function (err, decoded) {
            if (err) { throw { msg: "token expired or not authenticated", code: errors.ERR_NOT_AUTH }; }
            else {
                var role = decoded['role'];
                return does_role_can_access_api(role, api_name); // true or false             
            }
    });
}

Теперь некоторые третьи стороны хотят получить доступ к некоторым моих API. Express -Gateway использует API-ключи для приложений, которые хотят использовать мой сервер, сохраняя существующую аутентификацию JWT для отдельных пользователей.

Так что каждый запрос будет иметь ApiKey (на основе Приложение использовалось) и токен JWT (для идентификации пользователя):

  • ApiKey будет добавлен в заголовок сторонним сервером,
  • Будет извлечен токен JWT и) добавлено в заголовок web_storage браузера пользователя.

Звучит хорошо? Достаточно ли безопасно для CSRF?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...