我已经开发了一个REST API,有两种方法可以连接到它:会话和oauth。基本上,我的网站将使用会话模式,第三方软件将使用oauth模式。
我设法使会话和oauth模式都能在symfony中工作,但我不能使它们同时工作。
这是我的防火墙安全配置:
firewalls:
auth_oauth_token:
pattern: ^/auth/oauth/v2/token
security: false
api:
pattern: ^/api
anonymous: false
fos_oauth: true
stateless: true
auth:
pattern: ^/
anonymous: ~
form_login:
login_path: /auth/session/check
check_path: /auth/session/login
always_use_default_target_path: true
default_target_path: /auth/session/check
failure_path: /auth/session/check
failure_forward: false
use_forward: false
failure_forward: false
username_parameter: username
password_parameter: password
post_only: true
remember_me: false
require_previous_session: false
logout:
path: /auth/session/logout
target: /auth/session/logged_out
invalidate_session: false
会话处理:/auth/Session。OAuth处理:/auth/OAuth。Api:/Api。
因此,有了这个配置,首先使用"api"防火墙,我可以使用令牌登录。但是,即使使用会话登录,如果我不指定令牌,我也无法访问。
首先使用"auth"防火墙,我可以使用会话表单登录。但是,即使我指定了一个令牌,我也无法访问。
我被这个弄疯了。我在堆栈溢出上发现了一些关于链提供商的东西,我可能需要像"链防火墙"这样的东西。。。如果被禁止,请检查另一个防火墙。
感谢
我通过复制api控制器的路由来解决,这样我就有了一个依赖OAuth2的路由/api/method
和一个依赖标准(主)防火墙的/webapi/method
路由:
在安全方面。yml:
firewalls:
api:
pattern: ^/api
fos_oauth: true
stateless: true
oauth_token:
pattern: ^/oauth/v2/token
security: false
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
login_path: /login
check_path: /login_check
logout: true
anonymous: true
access_control:
- { path: ^/api, roles: [ IS_AUTHENTICATED_FULLY ] }
- { path: ^/web-api, roles: [ IS_AUTHENTICATED_FULLY ] }
在路由中。yml:
acme_api:
type: rest
prefix: /
resource: "@AcmeBundle/Resources/config/routing_api.yml"
在routing_api.yml:中
# REST API - OAUTH Access
acme_api_users:
resource: AcmeBundleControllerUsersController
type: rest
defaults: {_format: json}
prefix: /api
name_prefix: api_
# REST API - Frontend Client Access
acme_webapi_users:
resource: AcmeBundleControllerUsersController
type: rest
defaults: {_format: json}
prefix: /web-api
name_prefix: webapi_