Bonjour,

Ce sujet est plus une demande de conseils et d'idées dans le cadre d'un besoin d'évolution d'une application.

Contexte actuel

Je suis en charge depuis 2 ans maintenant d'un extranet permettant aux client de gérer leurs produits au sein de notre société.

C'est une application complexe, en terme de fonctionnalités, développées sous le framework Symfony2.

L'authentification est un basique système de type "user/password" géré avec brio par le bundle FOSUserBundle.

Objectif

Notre objectif d'évolution se décompose en deux points:

  • Proposer une API aux client avec authentification par clé privé et/ou apps OAuth2
  • Migrer, fonctionnalitée par fonctionnalitée, vers une application one page (angular, backbone...) qui utilisera la-dite API


Avancé

J'ai installé le bundle FOSRestBundle pour l'API reste est suivi cette documentation pour mettre en place un système d'authentification par token privé.

Cela fonctionne très bien et je compte aussi mettre en place FOSOAuthServerBundle pour une authentification par application et par credentials (user/password) afin de l'intégrer dans une application one page.

Problématique

Le soucis actuel est que mon système d'authentification pour l'api est complétement hermétique à celui du reste de l'application.

En voici mon fichier security.yml :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
security:
    encoders:
        FOS\UserBundle\Model\UserInterface: sha512
 
    role_hierarchy:
        ROLE_ALLOWED_TO_SWITCH: ~
        ROLE_SUPPORT:           ~
        ROLE_ADMIN:             [ROLE_SONATA_ADMIN]
        ROLE_SUPER_ADMIN:       [ROLE_ADMIN, ROLE_SUPPORT, ROLE_ALLOWED_TO_SWITCH]
 
    providers:
        fos_userbundle:
            id: fos_user.user_provider.username_email
        api_key_user:
            id: security.user.provider.api_key
 
    firewalls:
        dev:
            pattern:  ^/(_(profiler|wdt)|css|images|js)/
            security: false
 
        api:
            pattern: ^/api
            stateless: true
            simple_preauth:
                authenticator: security.authentication.authenticator.api_key
 
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider
                login_path: /login
                check_path: /login_check
 
            anonymous: ~
            logout:
                path: /logout
            switch_user: true
Ce que j'aimerai, c'est qu'une fois l'utilisateur authentifié via la méthode classique, il puisse acceder a /api afin de pouvoir faire fonctionner certaines pages en application JS.

Ceci permettrait de faire la transition "progressive".

Quel est le moyen, au plus propre possible, de faire "cohabiter" ces firewalls ? Dois-je en avoir qu'un seul ? Si oui, comment rendre certaines authentification stateless (api key) et pas d'autre (form login) ?

De manière plus générale, quelles méthodes et quels outils me conseillez-vous afin de mettre en place une application one page avec API ?

Merci d'avance pour vos réponses.

Sullivan