我使用FOSOAuthServerBundle作为我的oauth端点。我成功地使用Resource Owner Password Credentials
授予方法生成了一个令牌:
{
"access_token": "MY-FOO-TOKEN",
"expires_in": 3600,
"token_type": "bearer",
"scope": "read",
"refresh_token": "MY-BAR-REFRESH-TOKEN"
}
现在我想用它来获得一些受保护的资源。所以我做了:
curl -X GET -H "Authorization: Bearer MY-FOO-TOKEN" "http://localhost:8000/api/a-bar-resource"
熊似乎没有被发现。
INFOS:
echo $this->get('security.token_storage')->getToken();
给出:AnonymousToken(user="anon.", authenticated=true, roles="")
标题中有:
["authorization"]=> /** <-- Is the lowercase OK? **/
array(1) {
[0]=>
string(93) "Bearer MY-FOO-TOKEN"
}
我还尝试将access_token
作为查询参数传递,但没有成功。
现在我猜config.yml
或security.yml
出了问题。以下是一些选定的部件:
config.yml:
fos_oauth_server:
[...]
service:
options:
supported_scopes: read
user_provider: fos_user.user_provider.username_email
security.yml:
security:
[...]
firewalls:
api:
pattern: ^/api
fos_oauth: true
stateless: true
anonymous: false
access_control:
- { path: ^/api, roles: [ IS_AUTHENTICATED_ANONYMOUSLY ] }
我终于找到了问题的原因。由于相同的模式,我有一个防火墙使另一个防火墙无效:
security:
[...]
firewalls:
other_firewall: #this one
pattern: ^/
anonymous: true
api:
pattern: ^/api
fos_oauth: true
stateless: true
anonymous: true
我还认为,在一个防火墙中进行的身份验证在其他防火墙中是不可用的,因此将防火墙的数量减少到严格的最小值(一个不安全,一个有身份验证等)是一个很好的做法。然后使用access_control
进行精细访问。