Salut,
j'ai fais un frontend avec angulaJs et un Backend avec cakePhp pour l'api REST
j'ai un problème au niveau de l'authentification.
J'ai choisis une auth Basic dans CakePHP, donc dans l'appController
class AppController extends Controller {
public $components = array(
'DebugKit.Toolbar',
'Session',
'Cookie',
'Security',
'Auth' => array(
'authorize' => array('Controller'),
'authenticate' => array('Basic')
)
);
Dans app.js
$rootScope.$on('event:loginRequest', function(event, username, password) {
httpHeaders.common['Authorization'] = null;
$rootScope.user = "";
httpHeaders.common['Authorization'] = 'Basic ' + base64.encode(username + ':' + password);
$http.get($rootScope.appUrl + '/users/login.json')
.success(function(data) {
console.log('login data @' + data.user );
$rootScope.user = data.user;
$rootScope.$broadcast('event:loginConfirmed');
});
});
Dans UsersController.php
public function beforeFilter(){
parent::beforeFilter();
AuthComponent::$sessionKey = false;
}
public function login() {
if ($this->request->is('get')) {
if ( $this->Auth->login() ) {
$this->set(array(
'user' => $this->Session->read('Auth.User'),
'_serialize' => array('user')
));
} else {
$this->set(array(
'message' => array(
'text' => __('Invalid username or password, try again'),
'type' => 'error'
),
'_serialize' => array('message')
));
$this->response->statusCode(401);
}
}
}
Si j'enlève la ligne
AuthComponent::$sessionKey = false;
ça fonctionne mais si je me connecte et que je me déconnecte puis que je me reconnecte avec des champs vide, la connexion fonctionne... Normal d'après ce que j'ai compris puisque l'authentification reste en session
Donc si je remets cette ligne, ça ne fonctionne plus
je précise que j'ai bien les bonnes valeurs dans
$_SERVER['PHP_AUTH_USER'] et
$_SERVER['PHP_AUTH_PW']
Merci pour vos conseils
pour info j'ai suivi ce tuto: https://github.com/hantsy/angularjs-cakephp-sample/wiki
Zil...
Le problème avec le basic authentification c'est que le navigateur risque de retenir ta connexion tant qu'il est ouvert.
L'idée est alors de forcé un code 401 dans les headers pour forcer la demande de user, password , mais je ne suis pas sûr que tous les navigateurs y soient sensibles. Bref, la déconnexion est galère avec ce type d'authentification.
En ce qui concerne les authentifications "sateless", ils existent plusieurs manière de le faire :
A la connexion, un token est envoyé à l'utilisateur et stoké en base, ce token transite alors à chaque requête vers le serveur qui vérifie sa validité en base. On peut lui ajouter une date d'expiration etc...
Utiliser oAuth, oAuth2
Utiliser SAML (pas conseillé dans ton cas, c'est lourd et plutôt adapté au protection de webservice SOAP , le standard ws-security permettant facilement de l'encapsuler)
L'idée générale de ces authentifications sans état que l'on peut du coup étendre à la SSO est de faire porter l'authentification au navigateur via un token , un jeton de sécurité etc... On retrouve ainsi un service provider devant l'applicatif serveur chargé d'effectuer cette vérification.
Dans ton cas d'utilisation de cakephp, cette vérification de jeton valide, de token peut être porté par le beforefilter.
Dans logout, j'ai seulement mis
$this->Auth->logout()
ça vide la session ? ou faut mettre autre chose?
Bonjour,
encore une fois, REST est une architecture qui se veut stateless (sans état) donc pas de session côté serveur ...
Ici, tu ne fais donc pas du full REST.
Ce n'est pas grave du tout mais je le précise sur ce post vu que c'est pas la première fois que je vois le terme REST associé à une session...
OK, +1 pour le pas full REST
Ce serait quoi la solution alors ?
Même avec le sessionDestroy, ça fait la même chose... j'arrive à me connecter avec un user et password vide juste après une déconnexion
Salut,
je continue l'apprentissage... mais ce n'est pas gagné
J'ai installé le plugin cakephp-oauth-server
J'arrive à créer une table clients avec du style
client_id client_secret redirect_uri user_id
Quand un utilisateur s'enregistre, ça crée un champ du style
NTQ4ZWU1ZTfdNjk2NTll 48487cfed674d10854da6b525f723c253d347a7d http://localhost/myapp 38
ensuite j'arrive à me connecter en passant par l'url du style
myapp/oauth/login?response_type=code&client_id=NTQ4ZWU1ZTfdNjk2NTll&redirect_url=http%3A%2F%2Flocalhost
ça m'envoit bien sur la page d'accueil avec un code
myapp/?code=9f5586646427892ab24ef4c785e80e86ec43475e
Mais dès que je clique sur un lien, j'ai droit à un beau
{"error":"invalid_request","error_description":"Malformed auth header"}
De plus dans un view (default.ctp) j'avais un
<?php if ($this->Session->read('Auth.User.id')): ?>
qui m'affichait du contenu pour les utilisateurs connecté. Bien sûr maintenant ça ne fonctionne plus puisque l'user n'est plus en session. Donc par quoi puis-je remplacé ce test ?
Merci si vous avez des pistes, exemples
Zil...