2013-04-25 157 views
3

首先,让我描述一下应用程序:我们正在开发一个基于网络的软件,它是一种自定义帮助台应用程序。它要求用户登录(我们使用FOSUserBundle)。登录后,用户被重定向到仪表板。从仪表板不再有页面重新加载,前端基于Angularjs构建,用户无需重新加载页面即可在应用程序中的任何地方获取信息。你可以说一个单一的页面应用程序。REST API和客户端在同一台服务器上,需要API认证?

因此,呈现给用户的数据是从其余API(我们使用FOSRestBundle)获取的。这一点在这方面效果很好。

存在某种困境。只有我们的工作人员才能访问此应用程序(现在)。因此,工作人员需要登录才能访问帮助台。通过angularjs推送到前端的数据通过api调用,因此刚刚登录的用户需要在每个请求上再次进行身份验证,因为其余的都是。

问题:因为后端上的Symfony2运行让我们只是试图让当前登录用户对象的用户,当一个API调用时:

$this->get('security.context')->getToken()->getUser() 

回报匿名。是代表匿名,或者

$this->getUser(); 

回报只是

因此,使用其余api时,已验证的上下文似乎已消失。但是,当我直接调用一个动作而不休息时,我可以获取用户信息。

因此,我们需要的是确保我们的休息API,并获得每个API调用的用户信息。我们不希望第三方人员访问我们的应用程序,只是工作人员。我不熟悉OAuth,但用户将被重定向到第三方页面以允许/拒绝访问他的数据?这对我们来说不是一个选择。

根据这些信息,您是否有任何建议或想法如何保护api并传输用户数据,以便getUser不会返回null或anon。但真正登录的用户?

+0

很难猜测什么是错的......那肯定是在你的代码或配置错误的...但没有看到任何显示的代码在防火墙中的错误,怎么能人知道吗? – mpm 2013-04-25 22:06:07

+0

@mpm thx回复,看看我的编辑 – 2013-04-26 08:06:15

回答

3

还有另一种方式来解决问题。

这是通过使用证书。 可以生成证书,然后使用HTTP隧道(HTTPS obviousley),服务器将请求证书(你已经为此配置了Apache,但这不是一个很大的挑战)。

使用此功能,您必须在服务器端添加CertificateManager以确保证书有效并知道谁在调用服务(为了能够在每次请求时对用户进行身份验证),CertificateManager(或什么都你会称呼它)可能必须被配置在你过滤CHAINE(在Java世界已知的),等瞧

合,可以帮助您, Abderrazak

1

REST是无状态的,所以您将不得不在每个请求中发送某种身份验证/授权。您可以使用HTTP BASIC AUTH或类似OAuth的东西。

看一看https://github.com/FriendsOfSymfony/FOSOAuthServerBundle

我有种构建我们在完全相同的架构(基于REST的API应用程序与Symfony2的后端和AngularJS前端。

+1

+1 OAuth提示。但是现在我们不想将我们的api暴露给第三方客户,所以在这里处理OAuth可能是一种矫枉过正。因为同时访问应用程序的用户也是客户端。我会稍微扩展一下我的问题。 – 2013-04-26 07:18:59

+1

如果api由来自同一台服务器的javascript使用,则不需要使用openauth。您可以使用会话来检查用户是否已通过身份验证,如果不是,则需要授权后至少需要一个令牌系统。 – mpm 2013-04-26 08:38:40

+0

@mpm听起来很有希望。你可以发布这个答案并扩展一下,Fosuserbundle + Session而不是Cookie如何帮助我解决问题? – 2013-04-26 10:34:35

相关问题