分离后端(Symfony2)和前端(AngularJS) REST -如何认证


Separate backend (Symfony2) and frontend (AngularJS) REST - How to authenticate

对于下列问题我实在找不到明确的答案/方法:

我想有一个Symfony2后端,可能与FOSRestBundle,它只返回JSON。前端将用AngularJS编写。

用户应该能够注册/登录一个帐户仅为我的网站(选项#1)或通过现有的OAuth帐户登录,如谷歌或Xing (选项#2)。当然,身份验证应该/需要是无状态的。

由于大多数关于如何在symfony中验证RESTFul的示例完全是在php中(因此即使后端和前端是分开的,前端仍然是php),我真的很难弄清楚如何实现上述两个选项。我目前对后端的想法是:

  • 处理请求/响应的FOSRestBundle
  • FOSUserBundle用于新用户的注册、登录、密码重置等

我的问题是:

  1. 我如何认证一个普通用户(FOSUserBundle)无状态(选项#1)?我在文档中找不到关于如何将FOSUserBundle与单独的前端一起使用的任何内容。或者对于这种情况是否存在更好的捆绑包?
  2. 如果用户想通过OAuth2提供商进行身份验证(选项#2)应用程序的哪一部分(前端或后端)对OAuthProvider进行身份验证(例如Google)?我虽然在AngularJS认证(例如通过oauth-ng模块),获得AuthToken并将其发送到后端,在那里我匹配用户与他的id我(希望)从OAuthProvider获得。

除了这个问题,如果这种方法首先是正确的,我真的需要一些关于如何在symfony中实现这一点的提示。我知道,人们可以自定义symfony中的几乎任何东西(CustomUserProvicer, CustomAuthentication等),但在阅读这些细节之前,也许已经有一个简单的方法来解决我的问题。我的意思是,我不可能是唯一一个想要这个的人。

如果有什么不清楚的,就问!

我做了一个类似的API,我是这样做的:

我使用FOSUserBundle来创建"本地"用户(那些只在你的网站上)。为了支持无状态认证,我使用了FOSOauthServerBundle,它可以使用FOSUserBundle的用户提供程序。

然后我添加了两个字段到我的用户模型:

  • 一个整数字段名"origin",其值表示用户来自何处(0表示本机,1表示Facebook,…)
  • 一个"externalId"字符串字段,如果用户不是本地用户,则包含外部帐户上的用户ID, NULL否则

为了使用户能够使用外部帐户登录,我使用了自定义授权类型,请求作为参数的外部帐户(例如FaceBook)访问令牌,这是在客户端检索的,使用此访问令牌访问帐户信息,并执行以下操作:

  • (如果这是用户第一次进行身份验证),在数据库中创建一个新用户,如前所述设置origin和externalId字段,并在数据库中添加帐户信息(如名、姓)。然后给出API
  • 的访问令牌
  • 如果没有,则更新帐户信息并为API
  • 提供访问令牌

这样,一旦用户登录了,不管它来自哪里,但仍然可以知道用户的起源字段。

如果您想了解更多细节或在配置方面遇到麻烦,请不要犹豫,在这里留言,我很乐意提供帮助。