Я работаю над проектом Symfony 2.7, в котором есть как веб-интерфейс входа, так и аутентификация OAuth для API. Я использую FOSUserBundle для провайдера аутентификации и FOSOAuthServerBundle для обеспечения функциональности OAuth.
Я следую руководству, связанному с этим сообщением, для реализации OAuth с FOSOauthServerBundle FOSOAuthServerBundle с FOSUserBundle — как заставить его работать?
Я думаю, что почти готов, но проблема с безопасностью блокирует меня. Я установил брандмауэры в моем файле 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/, все будет работать нормально, но у меня возникнут проблемы с веб-аутентификацией.
Все контроллеры моего приложения находятся по пути /secured/, поэтому изменить основной брандмауэр это не проблема, если я позволю незащищенной форме брандмауэра шаблон ^/ несколько ошибок сформировать FOSUserBundle. Должен ли я создать специальный брандмауэр для операций входа/входа_проверки/выхода из системы и поместить основной брандмауэр из /secured/ или есть другой способ исключить брандмауэры OAuth и API из основного брандмауэра?