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...

8 réponses


antho07
Réponse acceptée

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 ton logout tu vide bien la session ?

zil
Auteur

Dans logout, j'ai seulement mis

$this->Auth->logout()

ça vide la session ? ou faut mettre autre chose?

Essaie peut être de rajouter un $this->Session->destroy() ?

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...

zil
Auteur

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

zil
Auteur

Ok, merci beaucoup, je vais regarder ça

zil
Auteur

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...