Мое мобильное гибридное приложение использует сервер expressJS в качестве бэкэнда для прокси-запросов на parse.com через REST API. Я также использую экспресс для собственной аутентификации пользователя с помощью поставщика единого входа. Я следил за this tutorial и немного изменил подход, чтобы работать для моей собственной установки (не используя CloudCode, также не аутентифицируясь с GitHub). Я также использую новые Revokable Sessions, которые появились в начале этого года (март 2015 г.). По существу учебник и мой подход к авторизации могут быть сведены к выполнению следующих действий на удаленном бэкэнд (ExpressJS/CloudCode):Parse sessionToken отменено при обновлении пароля пользователя
Войти как пользователь, чтобы получить информацию о сеансе токен
Создание нового пользователя, если имя пользователя не существует, а затем продолжить
Создать новый случайный пароль для пользователя (обновления пароля пользователи с MasterKey)
С новым паролем, войдите в систему как пользователь, чтобы сгенерировать Синтаксическая sessionToken
Pass назад sessionToken к клиентскому приложению
Это все работает нормально, это, кажется, «подход 'для входа в систему с сторонними поставщиками аутентификации.
Проблема в том, что каждый раз, когда мой пользователь входит в систему, sessionToken по существу воссоздается (как в, он разрушает старый и создает новый токен). Я вижу это в dataBrowser, поскольку объект sessionId отличается. Кроме того, основная проблема заключается в том, что мой пользователь может войти в систему на других устройствах или в веб-приложении и, по существу, каждый раз, когда пользователь переключает устройства, токен сеанса недействителен на других устройствах. Возвращаясь к этому устройству, требуется другой логин.
В блоге new enhance session упоминается, что новые сеансы revokable предусматривают «уникальные сеансы» для каждого устройства, однако по моему опыту это, похоже, не работает для пользователей, которые входят в систему через REST API из моего экспресс-сервера. Возможно, этот уникальный сеанс будет работать только в том случае, если само приложение будет обмениваться данными и, таким образом, сможет пройти по инсталляции, чтобы различать разные устройства.
Я отправил мой код аутентификации ниже, объект синтаксического анализа от этого npm parse library
upsertUser функции:
/**
* This function checks to see if this user has logged in before.
* If the user is found, update their password in order to 'become' them and then return
* the user's Parse session token. If not found, createNewUser
*/
exports.upsertUser = function(ssoData, deferred) {
var userCreated = (typeof deferred != "undefined") ? true : false;
var deferred = deferred || q.defer();
var query = {
where: {username: ssoData.uid.trim()}
};
// set masterKey
parse.masterKey = parseConfig.MASTER_KEY;
// find existing user by username
parse.getUsers(query, function (err, res, body, success) {
if (body.length) {
var userId = body[0].objectId;
var username = body[0].username;
var password = new Buffer(24);
_.times(24, function (i) {
password.set(i, _.random(0, 255));
});
password = password.toString('base64');
parse.updateUser(userId, {password: password}, function (err, res, body, success) {
if (typeof body.updatedAt != 'undefined') {
console.log('user update at: ', body.updatedAt);
parse.loginUser(username, password, function (err, res, body, success) {
deferred.resolve(body.sessionToken);
});
}
});
} else if (userCreated === false) {
console.log('object not found, create new user');
self.createNewUser(ssoData, deferred);
} else {
deferred.resolve();
}
});
return deferred.promise;
}
функция createNewUser:
/**
* This function creates a Parse User with a random login and password, and
* Once completed, this will return upsertUser.
*/
exports.createNewUser = function(ssoData, deferred) {
// Generate a random username and password.
var password = new Buffer(24);
_.times(24, function(i) {
password.set(i, _.random(0, 255));
});
var newUser = {
username: ssoData.uid,
password: password.toString('base64'),
};
// Sign up the new User
parse.createUser(newUser, function(err, res, body, success) {
if (err) {
console.log('new parse user err', err)
}
if (typeof body.sessionToken != "undefined") {
self.upsertUser(ssoData, deferred);
} else {
deferred.resolve();
}
});
}
Любые идеи, как я могу избежать аннулирование sessionTokens при последующих входах?
В качестве продолжения теперь у меня есть противоположная проблема, о которой не стоит беспокоиться, но каждый раз, когда пользователь регистрируется в новом токене сеанса, создается даже с одного и того же устройства. Все токены для пользователя, я предполагаю, будут действительны сейчас. – mfink
На какой странице настроек мы говорим здесь? Кажется, я не могу найти его. –
Извините, что я не был чист, но это было на старой службе parse.com, нолонгером с нами: '(, поэтому я не могу войти в систему, чтобы точно сказать, где именно. Это может быть или не быть в новом parse server или что-то еще, что есть версия с открытым исходным кодом. – mfink