我使用Symfony3作为FOSUserBundle,FOSRestBundle和HWIOauthBundle的后端框架。我也使用Angular2和NodeJS作为前端框架。
前端框架使用LexikJWTAuthenticationBundle从后端框架获取数据。目的是使用具有子类的主类“AbstractUser”对用户进行身份验证:
我成功设置了部分身份验证机制:
但是当我尝试从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请求)。
有什么解决方案可以提供帮助吗?如果可能,我需要安全的解决方案。我想到了这个想法:
如果有其他解决方案,请告诉我什么是最佳解决方案。
由于
答案 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上,您需要检查令牌是否有效。