У меня есть сервер 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?