Аутентификация без сохранения состояния (API) с помощью HWIOAuthBundle и Symfony2

В настоящее время мой проект (Frontend и Backend, оба Symfony2) использует HWIOAuthBundle для аутентификации через Google и т. д.

Так как я хочу отделить фронтэнд (фронтэнд AngularJS) от бэкенда. Коммуникация будет опираться на данные JSON (так что REST в целом).

Я столкнулся с проблемой, как добиться этого с помощью HWIOAuthBundle. В документации Symfony что-то говорится о stateless: true, но тогда HWIOAuthBundle не работает.

Кроме того: в будущем я хочу реализовать FOSUserBundle для нового пользователя (который не проходит аутентификацию через OAuth).

Мои вопросы: 1. Как я могу добиться аутентификации без сохранения состояния с помощью HWIOAuthBundle 2. Как мне достичь аутентификации без сохранения состояния в целом (HWIOAuthBundle и FOSUserBundle). В документации Symfony говорится, что аутентификация без сохранения состояния выполняется путем отправки имени пользователя/пароля в каждом запросе. Я думаю, что аутентификация с помощью токена - лучший способ (поскольку в контексте OAuth у меня нет имени пользователя/пароля).

Надеюсь, мой вопрос понятен!

# app/config/security.yml

security:
encoders:
      AppBundle\Entity\User:
           algorithm:        sha1
           encode_as_base64: false
           iterations:       1
providers:
    my_custom_hwi_provider:
        id: amagin_user.oauth_user_provider
    in_memory:
        memory:
            users:
                user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }

role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_USER

firewalls:
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false

    default:
        anonymous: ~
        http_basic: ~
        stateless:        false
        oauth:
            resource_owners:
                google:             "/login/check-google"
            login_path:        /login
            use_forward:       false
            failure_path:      /login

            oauth_user_provider:
                service: amagin_user.oauth_user_provider
        logout:
            path:   /logout
            target: /
access_control:
         #- { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
         - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
         - { path: ^/connect, role: IS_AUTHENTICATED_ANONYMOUSLY }
         - { path: ^/, role: ROLE_USER }

person mcode    schedule 02.07.2015    source источник


Ответы (1)


Мне удалось настроить клиент AngularJS с помощью Google oauth и Symfony REST API.

Вот файл security.yml:

security:
    encoders:
        FOS\UserBundle\Model\UserInterface: sha512

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_USER

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username_email

    firewalls:
        dev:
            pattern:  ^/(_(profiler|wdt)|css|images|js)/
            security: false

        login:
            pattern: ^/login
            logout: true
            anonymous: ~
            stateless: true
            oauth:
                require_previous_session: false
                success_handler: lexik_jwt_authentication.handler.authentication_success
                failure_handler: lexik_jwt_authentication.handler.authentication_failure
                check_path: /login_check
                resource_owners:
                    google: "/login/check-google"
                login_path: /login
                oauth_user_provider:
                    service: api.user_provider

        main:
            pattern: ^/api
            anonymous: ~
            stateless: true
            lexik_jwt: ~

    access_control:
        - { path: ^/login, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/api/doc, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/api, role: IS_AUTHENTICATED_FULLY }

config.yml:

hwi_oauth:
    connect:
        account_connector: api.user_provider
    firewall_names: [login]
    resource_owners:
        google:
            type:                google
            client_id:           "%google_app_id%"
            client_secret:       "%google_app_secret%"
            scope:               "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile"

Со стороны Angular я использую satellizer для получения токена авторизации, который затем отправляется в /login/check-google/, который отправляет обратно JWT.

Обратите внимание на использование LexikJWTAuthenticationBundle для создания JWT и защиты маршрутов на основе этого токена.

Однако есть одна нерешенная проблема: satellizer выполняет POST-запрос для получения access_token. Это неожиданное поведение для HWIOAuth (и тоже не имеет смысла), поэтому я добавляю его для форка. См. следующую проблему.

person DevAntoine    schedule 05.04.2016