我正在开发一个 Symfony 2.7 项目,该项目同时具有 Web 登录界面和 API 的 OAuth 身份验证。我使用 FOSUserBundle 作为身份验证提供程序,使用 FOSOAuthServerBundle 来提供 OAuth 功能。
我正在按照链接到这篇文章的指南使用 FOSOauthServerBundle 实施 OAuth 使用 FOSUserBundle 的 FOSOAuthServerBundle - 如何使其工作?
我想快到了,但安全问题阻止了我。我在我的 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 autentication 错误:
{"error":"access_denied","error_description":"OAuth2 authentication required"}
例如。
或者,一旦我获得了访问令牌,当我尝试访问以下资源时:
http://localhost:8000/app.php/api/article/?access_token=THISISMYACCESSTOKEN
我得到了 fos_login 而不是资源。
如果我将主防火墙修改为 ^/secured/ 一切正常,但我会遇到 Web autentication 问题。
我的应用程序的所有控制器都在 /secured/ 路径下,因此更改主防火墙不是问题,如果我让防火墙不受保护,^/ 模式会出现 FOSUserBundle 的几个错误。我应该为 login/login_check/logout 操作创建一个特定的防火墙,将主防火墙从 /secured/ 中放置,还是有另一种方法可以将 OAuth 和 API 防火墙排除在主防火墙之外?