【发布时间】:2017-12-21 10:20:12
【问题描述】:
我使用 Symfony3 作为带有 FOSUserBundle、FOSRestBundle 和 HWIOauthBundle 的后端框架。我还使用 Angular2 和 NodeJS 作为前端框架。
前端框架使用 LexikJWTAuthenticationBundle 从后端框架获取数据。目的是使用具有子类的主类“AbstractUser”对用户进行身份验证:
- FacebookUser、GoogleUser、...(用于 OAuth 身份验证)
- NativeUser(用于用户/密码验证)
我成功设置了部分认证机制:
- 用户/密码认证:我应该将用户从 Angular2 框架认证到 Symfony3 框架。因此 Symfony3 将发回将在标头中使用的令牌。
但是当我尝试从 Angular2 框架对 OAuth 用户进行身份验证时,我将被重定向到 symfony3 框架,并且在身份验证过程之后,Symfony3 将对用户进行身份验证并将用户返回到 Angular2 框架的页面。这似乎是合乎逻辑的。
但问题是 Angular2 框架无法识别经过身份验证的用户。事实上,用户已经通过 OAuth 提供者使用 Symfony3 框架(不是 Angular2)进行了身份验证。所以在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 Token 发送到 Angular2 框架(使用 Get 或 Post 方法),后者将使用它是时候获取 REST 数据了。但我不知道这是否安全,因为任何用户也可以向 angular2 框架发送恶意或伪造的 JWT 令牌。但是,当我尝试获取用户信息时,我可以使用 Symfony3 控制器验证此令牌。但是这一切安全吗?我对所有这些东西都很陌生,我不应该犯任何错误,尤其是在用户帐户(Facebook、Google 等)方面。
- 共享缓存中的令牌 (https://stackoverflow.com/a/39467076/8239292)。但这在两个网站(Angular2 和 Symfony3)之间可能吗?这也安全吗?缓存不用于保存令牌等敏感数据。而且会因为过期日期(大于token有效期时)产生很多问题。
如果有其他解决方案,请告诉我什么是最好的解决方案。
谢谢
【问题讨论】:
标签: angular symfony authentication oauth jwt