0

私は、Web ログイン インターフェイスと API の OAuth 認証の両方を持つ Symfony 2.7 プロジェクトに取り組んでいます。認証プロバイダーに FOSUserBundle を使用し、OAuth 機能を提供するために FOSOAuthServerBundle を使用します。

FOSOauthServerBundle を使用した OAuth の実装については、この投稿にリンクされているガイドに従っています FOSOAuthServerBundle with FOSUserBundle - How to make it works?

もうすぐ到着すると思いますが、セキュリティ上の問題が原因でブロックされています。securtiy.yml で次のようにファイアウォールを設定しました

firewalls:
    main:
        pattern: ^/
        form_login:
            provider: fos_userbundle
            csrf_provider: security.csrf.token_manager # Use form.csrf_provider instead for Symfony <2.4
            login_path:          fos_user_security_login
            check_path:          fos_user_security_check
            #default_target_path: app_website_index
        logout:       true
        anonymous:    true
        logout:
              path: fos_user_security_logout
              #target: index
              target: fos_user_security_login

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

    oauth_authorize:
        pattern:    ^/oauth/v2/auth
        # Add your favorite authentication process here
        form_login:
             provider: fos_userbundle
             csrf_provider: security.csrf.token_manager # Use form.csrf_provider instead for Symfony <2.4
             login_path:          fos_user_security_login
             check_path:          fos_user_security_check
             #default_target_path: app_website_index

    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: ^/admin/, role: ROLE_ADMIN }
    - { path: ^/api, roles: [ IS_AUTHENTICATED_FULLY ] }

問題は、API と OAuth ファイアウォールがメイン ^/ の下にあるため、ログインせずに localhost:8000/api/articles にアクセスしようとすると、OAuth 認証エラーが表示される代わりに、ログイン ページが表示されることです。 :

{"error":"access_denied","error_description":"OAuth2 authentication required"}

例えば。

または、アクセストークンを取得したら、次のようなリソースにアクセスしようとすると:

http://localhost:8000/app.php/api/article/?access_token=THISISMYACCESSTOKEN

リソースの代わりに fos_login を取得します。

メイン ファイアウォールを ^/secured/ に変更すると、すべて正常に動作しますが、Web 認証に問題が発生します。

私のアプリケーションのすべてのコントローラーは /secured/ パスの下にあるので、メインのファイアウォールを変更しても問題ありません。ファイアウォールから保護されていないものを ^/ パターン化して FOSUserBundle からいくつかのエラーを発生させても問題ありません。login/login_check/logout 操作用に特定のファイアウォールを作成する必要がありますか? メインのファイアウォールを /secured/ から配置する必要がありますか? または、メインのファイアウォールから OAuth & API ファイアウォールを除外する別の方法はありますか?

4

1 に答える 1

-1

かなり古い質問ですが、この行が原因だったと思います:

- { path: ^/api, roles: [ IS_AUTHENTICATED_FULLY ] }

「 http://localhost:8000/app.php/api/ ... 」で何を呼び出しても、ログインページにリダイレクトされます。

于 2016-05-21T15:07:22.757 に答える