Нам нужен custom saver
. Я постараюсь быть кратким и лаконичным.
Это очень полезно, если вам не нужна заставка браузера. Я думаю, что это может иметь некоторые приложения.
БАЗОВАЯ ИНФОРМАЦИЯ
Я предлагаю в PHP использовать различные файлы cookie для сохранения сеанса с session_name
или session.name directive
. Для каждого сайта мы должны установить имя сеанса.
В HTML мы должны использовать разные входные данные name
, поэтому входные данные app1 будут <input type='email' name='email_app1' />
, а app2 — email_app2
. Мы также можем отключить autocomplete
.
Данные сохраняются локально зашифрованными с помощью AES
. Для этого мы можем получить CryptoJS. Мы также хотим иметь salt hash
в клиенте.
КОНЦЕПЦИЯ (обобщение):
- Сохраните локально
password
в зашифрованном виде. Он возвращается контроллером входа. Конечно, если пользователь захочет.
- Сохраните
salt
, который меняется при каждом входе в систему. Конечно, если пользователь захочет.
- Когда пользователь возвращается на страницу входа, JavaScript проверяет наличие соли и отправляет ее на сервер. PHP возвращает фразу-пароль, а JavaScript расшифровывает локальный пароль.
пример кода:
В контроллере:
// I use functions in the controller like example
public function getLoginPage(){
// it prints the html and js to login using the basics how i have said
}
// salt is sended by the JavaScript
public function getPassphrase( $salt, $username ){
$passPhrase = get_passphrase_from_salt( $salt, $username, Request::IP() );
return $passPhrase;
}
// It is to get the salt
public function getSalt( $username, $password ){
$user = get_user( $username, $password );
// if valid user...
$passphrase = random_string();
$salt = random_string();
$encrypted = encrypt( $password, md5($passphrase) );
save_in_table_salt( $salt, $passphrase, $username, Request::IP() );
// it prints a JSON like example
return json_encode( array( 'salt' => $salt, 'encrypted' => $encrypted) );
}
// ... Normal login etc you could change the salt and reset in the client
В представление помещаем логику JavaScript. Я использовал localstorage
, но думаю, что это не важно.
// in login page
window.onload = function(){
if( localStorage.getItem('salt') !== null ) { // the data is saved
// Get the passphrase
ajax_call('post', 'getPassphrase', {
salt: localStorage.getItem('salt'),
username: localStorage.getItem('username')
}, function( passphrase ){
// It sets the inputs values!
document.getElementById('username_app1').value = localStorage.getItem('username');
document.getElementById('password_app1').value = decrypt( localStorage.getItem('password'), CryptoJS.MD5(passphrase) );
});
}
};
// it captures the submit action
document.getElementById('login_form').onsubmit = function(){
// it asks to user if he wants save locally the credentials
if( localStorage.getItem('salt') === null
&& confirm('Do you want save credentials?') ){
var form = this;
// get salt
ajax_call('post', 'getSalt', {
user: document.getElementById('username_app1').value,
password: document.getElementById('password_app1').value
}, function( object ){
localStorage.setItem('salt', object.salt);
localStorage.setItem('password', object.encrypted);
localStorage.setItem('username', document.getElementById('username_app1').value );
form.submit(); // now yes
});
return false; // it prevents submit
}
};
Вы должны знать, что код является образцом. Некоторых функций не существует, и это нужно только понимать. Нам нужно больше условий и логики, чтобы это работало.
ОБНОВЛЕНО: теперь работает с несколькими компьютерами, IP-защитой и многим другим!
person
SnakeDrak
schedule
21.08.2014