从Symfony3中的经过身份验证的用户(HWIOAuth)获取Angular2中的JWT令牌

时间:2017-07-17 01:13:34

标签: angular symfony authentication oauth jwt

我使用Symfony3作为FOSUserBundle,FOSRestBundle和HWIOauthBundle的后端框架。我也使用Angular2和NodeJS作为前端框架。

前端框架使用LexikJWTAuthenticationBundle从后端框架获取数据。目的是使用具有子类的主类“AbstractUser”对用户进行身份验证:

  • FacebookUser,GoogleUser,...(用于OAuth身份验证)
  • NativeUser(用于用户/密码验证)

我成功设置了部分身份验证机制:

  • 用户/密码验证:我应该将用户从Angular2框架验证到Symfony3框架。因此,Symfony3将发回将在标题中使用的令牌。

但是当我尝试从Angular2框架验证OAuth用户时,我将被重定向到symfony3框架,在身份验证过程之后,Symfony3将对用户进行身份验证,并将用户返回到Angular2框架的页面。这似乎是逻辑。

但问题是Angular2框架无法识别经过身份验证的用户。实际上,用户已使用Symfony3框架(而不是Angular2)通过OAuth提供程序进行了身份验证。所以在Angular2中,当我尝试调用一个页面http://symfony_framework/get_token时,它应该返回symfony3中经过身份验证的用户的JWT令牌,我发现这行代码:

$this->get('security.token_storage')->getToken();

返回此结果:

app.INFO: AnonymousToken(user="anon.", authenticated=true, roles="")

当我想到它时,我发现当我手动调用此页面http://symfony_framework/get_token时,它将打印JWT令牌,因为我通过此页面直接进行身份验证(使用我的cookie)但是使用Angular2时没有cookie(使用XHR请求)。

有什么解决方案可以提供帮助吗?如果可能,我需要安全的解决方案。我想到了这个想法:

  • 使用Symfony3从Angular2向OAuth提供程序进行身份验证后,当Symfony将用户重定向到Angular2页面时,它还会将JWT令牌发送到Angular2框架(使用Get或Post方法),接下来将使用它获取REST数据的时间。但我不知道这是否安全,因为任何用户也可以向angular2框架发送恶意或伪造的JWT令牌。但是,当我尝试获取用户信息时,我可以使用Symfony3 Controller验证此令牌。但这一切都安全吗?我是所有这些事情的新手,我不应该犯任何错误,特别是对于用户帐户(Facebook,Google,...)。
  • 在缓存中共享令牌(https://stackoverflow.com/a/39467076/8239292)。但这可能在两个网站(Angular2和Symfony3)之间?这也是安全的吗?缓存不用于保存令牌等敏感数据。由于到期日期(当它大于令牌有效期时),它会产生许多问题。

如果有其他解决方案,请告诉我什么是最佳解决方案。

由于

1 个答案:

答案 0 :(得分:0)

我真的不知道'我是否尝试从Angular2框架验证OAuth用户的逻辑,我将被重定向到symfony3框架,并且在身份验证过程之后,Symfony3将对用户进行身份验证并将用户返回给Angular2框架的页面完全正常或正确。

您似乎有一个处理身份验证的Symfony3站点,另一个Angular站点处理前端视图。我认为问题可能是您已登录Symfony3并且用户存储在会话中。但Angular是纯粹的客户端框架。它无法从Symfony3获得这个“会话”。因此,在Angular中,您未经过身份验证。

我要做的是使用RESTful API进行身份验证。正如您所说,Symfony3将是一个后端框架,它处理Angular的POST API请求(http://symfony_api/authentication)并对用户进行身份验证。 FOSUserBundle和LexikJWTAuthenticationBundle将生成一个JWT令牌,可以作为对Angular的响应发送。然后,在Angular站点上,您可以根据安全策略将此令牌存储在不同的存储中。现在你也在Angular上“登录”了。稍后,当您想要获取任何用户信息时,您需要在HTTP请求标头中包含令牌(http://symfony_api/get_user,{授权:Bearer MY_ACCESS_TOKEN})。在Symfony3上,您需要检查令牌是否有效。