首页 文章

当提供令牌时,Symfony2 OAuth会不断给我一个登录页面

提问于
浏览
2

我已经设置了一个应用程序:

  • FriendsOfSymfony / FOSUserBundle

  • FriendsOfSymfony / FOSOAuthServerBundle

  • FriendsOfSymfony / FOSRestBundle

我已经成功创建了一个客户端,并且可以使用这样的URL获取访问令牌

http://api.mydomain.com/oauth/v2/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=password&username=mikebates&password=secret

但是,当我尝试访问这样的URL时http://api.mydomain.com/api/surgeries/45/details?access_token=ACCESS_TOKEN

我被重定向到symfony登录页面,但我不能拥有它,或者我构建的移动应用程序使用此REST API将无法访问 .

我使用本教程进行设置(删除那里的User / UserRepository类并将其改为与FOSUserBundle一起使用)http://blog.tankist.de/blog/2013/07/16/oauth2-explained-part-1-principles-and-terminology/

I'm not sure where I have told symfony to redirect to the login page, I want to change that logic to just authenticate from the token.

这是我的设置概述

security.yml

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

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username  

    firewalls:
        ...

        login:
            pattern:  ^/secured/login$
            security: false

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

        oauth_authorize:
            pattern:    ^/oauth/v2/auth
            form_login:
                provider: fos_userbundle
                check_path: _security_check
                login_path: _demo_login
            anonymous: true

        api:
            pattern:    ^/api
            fos_oauth:  true
            stateless:  true
            anonymous:  false # can be omitted as its default value

    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/api, roles: [ IS_AUTHENTICATED_FULLY ] }
        - { path: ^/oauth/v2/auth_login, role: IS_AUTHENTICATED_ANONYMOUSLY }

config.yml

# FriendsOfSymfony : Rest
fos_rest:
    disable_csrf_role: ROLE_API
    param_fetcher_listener: true
    view:
        view_response_listener: 'force'
        formats:
            xml:  true
            json: true
        templating_formats:
            html: true
        jsonp_handler: ~
    format_listener:
        rules:
            - { path: ^/, priorities: [ html, jsonp, json, xml ], fallback_format: ~, prefer_extension: true }
    exception:
        codes:
            'Symfony\Component\Routing\Exception\ResourceNotFoundException': 404
            'Doctrine\ORM\OptimisticLockException': HTTP_CONFLICT
        messages:
            'Symfony\Component\Routing\Exception\ResourceNotFoundException': true
    allowed_methods_listener: true
    access_denied_listener:
        json: true
    body_listener: true

# FriendsOfSymfony : User
fos_user:
    db_driver: orm
    firewall_name: main
    user_class: Incompass\UserBundle\Entity\Person
    group:
        group_class: Incompass\UserBundle\Entity\Group

# FriendsOfSymfony : OAuth
fos_oauth_server:
    db_driver: orm
    client_class: Incompass\AuthBundle\Entity\Client
    access_token_class: Incompass\AuthBundle\Entity\AccessToken
    refresh_token_class: Incompass\AuthBundle\Entity\RefreshToken
    auth_code_class: Incompass\AuthBundle\Entity\AuthCode
    service:
        user_provider: fos_user.user_provider.username
        options:
            supported_scopes: user

1 回答

  • 6

    我通过更改security.yml中防火墙的顺序解决了这个问题

    firewalls:
        oauth_authorize:
            pattern:    ^/oauth/v2/auth
            form_login:
                provider: fos_userbundle
                check_path: /oauth/v2/auth_login_check
                login_path: /oauth/v2/auth_login
            anonymous: true
    
        oauth_token:
            pattern:    ^/oauth/v2/token
            security:   false
    
        api:
            pattern:    ^/api
            fos_oauth:  true
            stateless:  true
    
        login:
            pattern:  ^/secured/login$
            security: false
    
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider
            logout:       true
            anonymous:    true
    
        dev:
            pattern:  ^/(_(profiler|wdt)|css|images|js)/
            security: false
    
        secured_area:
            pattern:    ^/secured/
            form_login:
                provider: fos_userbundle
                check_path: _security_check
                login_path: _demo_login
            logout:
                path:   _demo_logout
                target: _demo
    

相关问题