gpt4 book ai didi

javascript - 用户密码更新时解析 sessionToken 被撤销

转载 作者:行者123 更新时间:2023-11-28 15:19:29 25 4
gpt4 key购买 nike

我的移动混合应用程序使用expressJS服务器作为后端,通过REST API代理对parse.com的请求。我还使用 Express 与 SSO 提供商进行我自己的用户身份验证。我关注了this tutorial并对方法进行了一些修改以适合我自己的设置(不使用 CloudCode,也不使用 GitHub 进行身份验证)。我还使用了今年早些时候(2015 年 3 月?)推出的新的可撤销 session ,本质上,教程和我的身份验证方法可以归结为在远程后端(ExpressJS/CloudCode)上执行以下操作:

以用户身份登录以获取 session token

  1. 如果用户名尚不存在,则创建一个新用户,然后继续

  2. 为用户创建一个新的随 secret 码(使用masterKey更新用户密码)

  3. 使用新密码,以用户身份登录以生成 Parse sessionToken

  4. 将 sessionToken 传回客户端应用

这一切都工作正常,这似乎是使用第三方身份验证提供商登录的“方法”。

问题是每次我的用户登录时,sessionToken 本质上都会被重新创建(例如,它会销毁旧的 token 并创建一个新的 token )。我可以在 dataBrowser 中看到这一点,因为 session objectId 不同。此外,主要问题是我的用户可能已登录其他设备或网络应用程序,并且基本上每次用户切换设备时, session token 都会在其他设备上失效。然后返回该设备需要再次登录。

new enhance session博客文章提到新的可撤销 session 为每个设备提供“唯一 session ”,但是根据我的经验,这似乎不适用于从我的 Express 后端通过 REST API 登录的用户。也许这个独特的 session 仅在应用程序本身进行通信以进行解析时才有效,因此能够传递 InstallationId 来区分不同的设备。

我已经在下面发布了我的身份验证代码,解析对象来自此 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;
}

创建新用户函数:

/**
* 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();
}

});

}

有什么想法可以避免后续登录时 sessionToken 失效吗?

最佳答案

天哪,我错过了设置页面上的一个切换:

Revoke existing session tokens when user changes password

就这么简单;-) 不过,我认为我不会在不同设备上获得独特的 session 。

关于javascript - 用户密码更新时解析 sessionToken 被撤销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32130972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com