REST API/单页应用程序的Symfony路由


Symfony routing for a REST API / Single page app

我正在尝试为我的Symfony2单页应用程序设置路由,但我不知道如何正确地进行,而不会让它感到超级黑客。

以下是我需要它做什么,以及我如何尝试设置它:

身份验证时

  • 任何请求application/json的路由都应该像往常一样命中它们设置的路由。

  • 任何输入的不请求application/json的路由都应该加载一个控制器,该控制器会呈现一个包含我的单页应用程序的所有JS的小树枝文件。

  • 任何不存在并最终寻找符号路由的静态资源,例如[.js、.css、.jpeg等],都应该返回404。

未通过身份验证时

  • 任何请求application/json的东西都应该返回403

  • 任何未请求application/json的内容都应返回到登录页面

以下是我迄今为止所做的尝试:

  • 使用FOSRestBundle为每个服务设置路由

  • 如果请求不是application/json ,则设置一个返回基本控制器html的侦听器

    if (!in_array('application/json', $request->getAcceptableContentTypes())) {
        $fakeRequest = $event->getRequest()->duplicate(
            null,
            null,
            array('_controller' => 'HvHDashboardBundle:Dashboard:index')
        );
        $controller = $this->resolver->getController($fakeRequest);
        $event->setController($controller);
    }
    
  • 如果静态资源不存在,则设置一组"catch-all"路由以伪造404。

    # routing.yml
    # Catch any files that are meant to be their own static resource and return 404  
    catch_all_fail:
        pattern:  /{uri}.{_format}
        defaults: { _controller: MyBundle:Dashboard:return404 }
        requirements:
            _format: js|hbs|css|jpg|gif|jpeg|png
    

问题

  • 这种方法感觉像是一次大规模的黑客攻击,而不是Symfony路由系统的工作方式
  • 即使您没有通过身份验证,也会返回基本控制器页,因为类型侦听器在安全上下文之前被命中并强制呈现该控制器

问题:

其他人如何通过使用Symfony的路由和单页应用程序来解决这个问题,他们最初需要用trick呈现HTML,然后JS接管并请求JSON?

只生成一个API,根本没有静态页面。相信我,我最近和Symfony做了一个中等规模的API,这就是我要做的。如果不将API与静态页面混合,它将大大简化后端安全性。当然,如果你想拥有某种登陆页之类的东西,你仍然可以拥有静态页面。但尽量不要将它们与主应用程序混合使用。

即使是登录,也不要创建静态页面,而是使用一个api路由来验证用户名/密码,并向用户返回auth令牌作为响应。例如,一个用户可以有多个令牌(可以在多个位置登录),每次都会在请求标头中发送令牌。

如果令牌验证正常,symfony将知道它属于哪个用户,因此您将知道"用户"。如果不存在令牌,它应该返回"未通过身份验证",如果令牌无效,也可以返回类似的内容或"错误请求"。

在使用API时,我必须做的一件事是,我必须编写一个请求侦听器来接受JSON内容并将其转换为请求对象,这样我就可以使用$request->request访问数据。

如果你有任何问题,请在评论中告诉我,我可以提供帮助。

就路由而言,遵循REST规则就可以了。