2015-08-21 2 views
0

Мое мобильное гибридное приложение использует сервер expressJS в качестве бэкэнда для прокси-запросов на parse.com через REST API. Я также использую экспресс для собственной аутентификации пользователя с помощью поставщика единого входа. Я следил за this tutorial и немного изменил подход, чтобы работать для моей собственной установки (не используя CloudCode, также не аутентифицируясь с GitHub). Я также использую новые Revokable Sessions, которые появились в начале этого года (март 2015 г.). По существу учебник и мой подход к авторизации могут быть сведены к выполнению следующих действий на удаленном бэкэнд (ExpressJS/CloudCode):Parse sessionToken отменено при обновлении пароля пользователя

Войти как пользователь, чтобы получить информацию о сеансе токен

  1. Создание нового пользователя, если имя пользователя не существует, а затем продолжить

  2. Создать новый случайный пароль для пользователя (обновления пароля пользователи с MasterKey)

  3. С новым паролем, войдите в систему как пользователь, чтобы сгенерировать Синтаксическая sessionToken

  4. 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 при последующих входах?

ответ

4

блин, кажется, есть переключатель на странице настроек, которые я пропустил:

Revoke существующих сеансов маркеров, когда пользователь изменяет пароль

просто, как это я думаю ;-) Тем не менее, я не думаю, что я получу уникальные сеансы на разных устройствах.

+0

В качестве продолжения теперь у меня есть противоположная проблема, о которой не стоит беспокоиться, но каждый раз, когда пользователь регистрируется в новом токене сеанса, создается даже с одного и того же устройства. Все токены для пользователя, я предполагаю, будут действительны сейчас. – mfink

+0

На какой странице настроек мы говорим здесь? Кажется, я не могу найти его. –

+1

Извините, что я не был чист, но это было на старой службе parse.com, нолонгером с нами: '(, поэтому я не могу войти в систему, чтобы точно сказать, где именно. Это может быть или не быть в новом parse server или что-то еще, что есть версия с открытым исходным кодом. – mfink

Смежные вопросы