Symfony:我可以同时使用JWT + oAuth来验证不同的用户吗?

时间:2018-03-29 08:44:30

标签: symfony oauth-2.0 jwt

在解释为什么我需要你的帮助之前,请记住我在Symfony 3.4上是全新的,所以请对我宽容。

我尝试创建的是RESTful API

对于管理部分,我希望我的用户每天都能登录才能访问应用程序信息中心。我已经这样做了,使用带有每24小时过期的令牌的LexikJWTAuthenticationBundle

然后,我的API将有几个client applications应该使用访问令牌访问我的数据,但不使用JWT。这些客户端应用程序将是移动应用程序(在React Native上实现)和桌面应用程序(在Electron上实现)

我认为我应该授权这些应用程序访问我的API的方法是使用oAuth协议为他们提供身份验证令牌。

所以,基本的问题是,如果我可以同时为同一资源配置两个授权方法(JWT + oAuth)

因此,举例来说,我要说我有以下端点:/api/v1/repository/chocolates

使用jms_serializer我可以选择要在每个组上显示的数据,因此对于用户有ROLE_ADMIN我可以显示所有产品信息,而对于用户有ROLE_SOME_GRANT只能查看标题和说明。

是否可以使用我的管理员拥有的/api/v1/repository/chocolates令牌或使用我的客户端应用所拥有的JWT令牌来访问oAuth

目前我的app/config/security.yml设置如下:

# To get started with security, check out the documentation:
# https://symfony.com/doc/current/security.html
security:

    encoders:
        FOS\UserBundle\Model\UserInterface: bcrypt

    role_hierarchy:
        ROLE_ADMIN:         ROLE_USER
        ROLE_NUTRITIONIST:  ROLE_USER
        ROLE_SUPER_ADMIN:   ROLE_ADMIN

    # https://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded
    providers:
        fos_userbundle:
            id: fos_user.user_provider.username_email

    firewalls:
        # disables authentication for assets and the profiler, adapt it according to your needs
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        oauth_token:
            pattern: ^/oauth/v2/token
            security: false

        oauth_authorize:
            pattern: ^/oauth/v2/auth
            security: false

        api_user_management:
            pattern:    ^/api/v1/user/(login|request\/reset|password\/reset)
            anonymous:  true
            stateless:  true

        api_user_management_safe:
            pattern:    ^/api/v1/user/(login|request\/reset|password\/reset)
            anonymous:  true
            stateless:  true

        api_user_login:
            pattern:    ^/api/v1/login
            stateless:  true
            anonymous:  true
            form_login:
                check_path:               /api/v1/login
                require_previous_session: false
                username_parameter:       username
                password_parameter:       password
                success_handler:          lexik_jwt_authentication.handler.authentication_success
                failure_handler:          lexik_jwt_authentication.handler.authentication_failure
            logout:     true

        #############################################
        ## HERE IF I CHANGE THE fos_oauth to false
        ## I CAN ACCESS MY ENDPOINT : /api/v1/register/new/user
        ## WHILE IF THAT IS TRUE I GET THE ERROR MESSAGE:
        ##
        ## {
        ##     "error": "invalid_grant",
        ##     "error_description": "The access token provided is invalid."
        ## }
        #############################################

        api_access:
            pattern:    ^/api/v1
            stateless:  true
            #lexik_jwt:  ~
            guard:
                authenticators:
                    - lexik_jwt_authentication.jwt_token_authenticator
            fos_oauth: true

    access_control:
        - { path: ^/api/v1/user/request/reset,                          role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/api/v1/user/password/reset,                         role: IS_AUTHENTICATED_ANONYMOUSLY }

        - { path: ^/api/v1/user/update,                                 role: IS_AUTHENTICATED_FULLY }
        - { path: ^/api/v1/user/((?!request)|(?!password)|(?!update)),  role: IS_AUTHENTICATED_FULLY }
        - { path: ^/api/v1/register/new/user,                           role: IS_AUTHENTICATED_FULLY }
        - { path: ^/api/v1/,                                            role: IS_AUTHENTICATED_FULLY }

那么,基于该安全设置,您认为在我的应用程序中有多种授权服务吗?

0 个答案:

没有答案