J'envoie des données d'un formulaire avec AJAX. Les données sont un nom d'utilisateur et un mot de passe de l'utilisateur, et par conséquent, je souhaite le rendre aussi sécurisé que possible.
J'essaie d'utiliser token
comme couche de sécurité supplémentaire, mais le résultat est toujours renvoyé sous la forme " non valide ".
J'ai traversé https://docs.joomla.org/How_to_add_CSRF_anti-spoofing_to_forms et je ne vois pas que quelque chose ne va pas.
Mon formulaire de connexion:
<form method="post" action="#" id="userForm">
<label for="username">Brugernavn</label>
<input type="text" value="" name="username">
<label for="password">Password</label>
<input type="password" value="" name="password">
<?php echo JHtml::_( 'form.token' ); ?>
<button id="login-user">Login</button>
</form>
La demande AJAX:
jQuery.ajax({
url: 'index.php?option=com_content&format=ajax&view=article&task=loginUser&tmpl=component',
type: 'post',
dataType: 'html',
data: {
form: jQuery(form).serializeArray()
},
async: true,
success: function(response){
console.log(response);
var result = response;
if ( result.loggedIn == 1 ) {
//User logged in
jQuery('#loginModal').modal('hide');
}
else {
//User not logged in
}
}
});
La fonction qui est appelée dans mon view.ajax.php
public function _logInUser( $form ){
$options = array();
$credentials = array();
var_dump($form);
JSession::checkToken() or die( 'Invalid Token' );
$credentials['username'] = $form[0]['value'];
$credentials['password'] = $form[1]['value'];
$result = JFactory::getApplication()->login($credentials, $options);
$result = ($result) ? 1 : 0;
//1 - logged in
//0 - not logged in
echo json_encode( array('loggedIn' => $result) );
jexit();
}
Et la sortie dans ma console de var_dump($form);
array(3) {
[0]=>
array(2) {
["name"]=>
string(8) "username"
["value"]=>
string(20) "[email protected]"
}
[1]=>
array(2) {
["name"]=>
string(8) "password"
["value"]=>
string(8) "mypassword123"
}
[2]=>
array(2) {
["name"]=>
string(32) "dc56f674238905e70ab3d98f9bb6e2f0"
["value"]=>
string(1) "1"
}
}
Invalid Token
La seule chose à laquelle je peux penser, est que &format=ajax
Ou dataType: 'html'
Devrait être quelque chose comme json
ou peut-être raw
... mais quand j'ai essayé , alors l'appel ne fonctionne pas du tout.
Par défaut, JSession :: checkToken () vérifie la demande de publication pour une valeur nommée le jeton. Il peut également être configuré pour rechercher des valeurs dans une chaîne de requête telle que JSession :: checkToken ('get'). Il ne sait pas qu'une variable que vous avez sérialisée manuellement dans une structure que vous avez construite et que vous appelez "formulaire" est l'endroit où trouver le jeton.
Pour le tester manuellement, vous pouvez effectuer les opérations suivantes:
if ($form[2]['name'] != JSession::getFormToken()){die();}
Je n'ai pas testé cela, mais je ne vois pas pourquoi cela ne fonctionnerait pas. Une fois qu'un jeton CSRF est créé pour la session, il reste généralement le même.