我一直在设置FOSUserBundle/RestBundle/OAuthServerBundle三重奏来创建无头后端,然后我可以将单独的前端放在顶端,并最终扩展到移动设备,并且可能的第三方API访问。基于可用的各种资源和指令,我具有常规配置,并且可以使用客户端证书生成访问令牌。使用FOSUserBundle + FOSOAuthServerBundle进行用户身份验证流程
这是被添加到应用程序是一个现有的使用标准的Symfony /枝条为前端/后端相互作用,并使用FOSUserBundle进行认证。
我有相关的认证流程两个问题。
- 我希望用户能够访问的API的某些部分没有经过认证的客户端级别,而有些部分需要用户级身份验证来验证自己拥有所请求的资源。我没有找到办法做到这一点。我发现帖子在谈论这种可能性,但没有给出如何实现它的任何方向。我相信我需要在控制器级别检查适当的访问权限,可能使用自定义选民,因为在与客户端进行身份验证之后,检查“IS_AUTHENTICATED_FULLY”是否会恢复为真。我希望能够以编程方式验证用户,绕过UI登录表单 - 这可能只是重写FOSUserBundle登录控制器,但我不确定。
- 我要么需要在不访问令牌到期创建一个客户端或找到一种方法来实现刷新令牌。我真的不明白为什么我自己的应用程序需要刷新令牌,但如果这是做标准的方式,我可以遵循以下规范。
下面是一些相关的代码,尽管总的来说代码是从FOSOAuthServer安装指南复制过来的漂亮的盒子标准东西。
security.yml
security:
encoders:
FOS\UserBundle\Model\UserInterface: sha512
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
firewalls:
oauth_token:
pattern: ^/oauth/v2/token
security: false
rest:
pattern: ^/rest(?!/doc)
fos_oauth: true
stateless: true
anonymous: false
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_token_generator: security.csrf.token_manager
success_handler: security.authentication.success_handler
use_referer: true
logout: true
anonymous: true
access_control:
- { path: ^/rest, roles: [ IS_AUTHENTICATED_FULLY ] }
config.yml片断
fos_user:
db_driver: orm
firewall_name: main
user_class: AppBundle\Entity\User
registration:
form:
type: AppBundle\Form\Type\RegistrationFormType
profile:
form:
type: user_profile
fos_oauth_server:
db_driver: orm
client_class: AppBundle\Entity\Client
access_token_class: AppBundle\Entity\AccessToken
refresh_token_class: AppBundle\Entity\RefreshToken
auth_code_class: AppBundle\Entity\AuthCode
service:
user_provider: fos_user.user_provider.username_email
options:
supported_scopes: user
fos_rest:
view:
view_response_listener: force
formats:
json: true
templating_formats:
html: true
mime_types:
json: ['application/json', 'application/json;version=1.0', 'application/json;version=1.1']
jpg: ['image/jpeg']
png: ['image/png']
body_listener: true
param_fetcher_listener: true
allowed_methods_listener: true
format_listener:
rules:
- { path: ^/, priorities: [html, json], fallback_format: json, prefer_extension: false }