使用HWIOAuthBundle和Symfony2进行无状态(API)身份验证

时间:2015-07-02 11:08:49

标签: angularjs symfony authentication oauth hwioauthbundle

目前我的项目(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 }

1 个答案:

答案 0 :(得分:0)

我设法使用Google oauth和Symfony REST API配置AngularJS客户端。

这是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方面我使用卫星获取一个授权令牌,然后将其发送到/ login / check-google /后退一个JWT。

请注意使用LexikJWTAuthenticationBundle生成JWT并根据此令牌保护路由。

但是有一个未解决的问题:satellizer执行POST请求以获取access_token。对于HWIOAuth来说这是一个意想不到的行为(也没有任何意义),所以我添加了它。请参阅the following issue