Это отличный вопрос. Как вы видели, express-stormpath использует безопасные, только http-файлы cookie для хранения токенов, и это не работает для Cordova, Electron и т. Д., Где хранилище cookie не реализовано в спецификации. Альтернативой является локальное хранилище или какой-либо другой API хранения, который предоставляется вам (надеюсь, это безопасный!).
Библиотека экспресс-шторма предоставляет маршрут /logout
, и он отменяет токены, но ищет маркеры в куки. Нам нужно добавить новый маршрут, вероятно, /oauth/revoke
, для поддержки явного отзыва токена.
Это довольно легко добавить сейчас как пользовательский обработчик маршрута, и я включаю ссылку ниже. Но имейте в виду, что express-stormpath использует локальную проверку токена по умолчанию. Это делается для скорости (без обратной связи с нашим API), но оговорка заключается в том, что ваш локальный сервер НЕ будет знать, что токены были отменены и могут технически использоваться для проверки подлинности, если злоумышленник третьей стороны украл их у вашего клиента. Если это проблема, к которой вы хотите обратиться, вы должны отказаться от проверки stormpath
, которая всегда будет требовать проверки против нашей базы данных токенов. Это описано здесь:
http://docs.stormpath.com/nodejs/express/latest/authentication.html#token-validation-strategy
Все, что сказал, вот обработчик маршрут, который можно подключить в качестве /oauth/revoke
, и ваш клиент Electron использовать его, чтобы отменить маркеры, когда пользователь выходит из системы:
'use strict';
var revokeToken = require('express-stormpath/lib/helpers/revoke-token');
function defaultResponder(res, err) {
if (err) {
console.error(err); // or your system logger
return res.status(err.status || 400).json({
message: err.developerMessage || err.message
});
}
res.end();
}
/**
* Implements the expected behavior of the /oauth/revoke endpoint, and requires
* that token_type be defined. This assumes that you are using the express-stormpath
* module, so that your Stormpath client and configuration context is available.
*
* @param {Object<ExpressRequest>} req Express JS Request
* @param {Object<ExpressResponse>} res Express JS Response
*/
function revokeTokens(req, res){
var client = req.app.get('stormpathClient');
var config = req.app.get('stormpathConfig');
var secret = config.client.apiKey.secret;
var token = req.body.token;
var token_type = req.body.token_type;
if (!token || ! token_type) {
defaultResponder(res, {
message: 'token and token_type fields are required'
});
}
if (token_type === 'access_token') {
revokeToken.revokeAccessToken(client, token, secret, defaultResponder.bind(null, res));
} else if (token_type === 'refresh_token') {
revokeToken.revokeRefreshToken(client, token, secret, defaultResponder.bind(null, res));
} else {
defaultResponder(res, {
message: 'invalid token_type'
});
}
}
module.exports = revokeTokens;
Если вы обнаружите, что вы не хотите использовать экспресс-stormpath и хотели бы использовать что-то более прямое, вы можете опуститься до Stormpath Node SDK и использовать его для маркеров отзыва:
https://docs.stormpath.com/nodejs/jsdoc/AccessToken.html
Или вы можете сделать DELETE запросы непосредственно против нашего API:
https://docs.stormpath.com/rest/product-guide/latest/auth_n.html#revoking-access-and-refresh-tokens
В обоих случаях вы будете делать это с вашего сервера, а не приложение Electron.
Надеюсь, это поможет!
-Robert
Привет! Я работаю в [Stormpath] (https://stormpath.com), поэтому могу, конечно, помочь здесь. Можете ли вы сказать мне, используете ли вы библиотеку 'express-stormpath' (которая управляет токенами через файлы cookie) или если вы интегрируете более непосредственно, например вручную создаете токены с конечной точкой/oauth/token, предоставляемой Stormpath? Благодаря! – robertjd
Я вручную создаю токены через oauth/tokens. –
Спасибо за обновление! Я должен показать вам, как это сделать с образцом кода, который я собираю сейчас. Я отвечу на ответ, когда будет готов. – robertjd