从 Symfony3 中经过身份验证的用户 (HWIOAuth) 获取 Angular2 中的 JWT 令牌
Posted
技术标签:
【中文标题】从 Symfony3 中经过身份验证的用户 (HWIOAuth) 获取 Angular2 中的 JWT 令牌【英文标题】:Getting the JWT Token in Angular2 from an authenticated user (HWIOAuth) in Symfony3 【发布时间】: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://***.com/a/39467076/8239292)。但这在两个网站(Angular2 和 Symfony3)之间可能吗?这也安全吗?缓存不用于保存令牌等敏感数据。而且会因为过期日期(大于token有效期时)产生很多问题。如果有其他解决方案,请告诉我什么是最好的解决方案。
谢谢
【问题讨论】:
【参考方案1】:我真的不知道'我尝试从 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,Authorization: Bearer MY_ACCESS_TOKEN)。在 Symfony3 上,您需要检查令牌是否有效。
【讨论】:
感谢您的回复。是的,我知道。在我做的工作期间,我没有使用这些会话。如您所说,我在标头中使用了 JWT 令牌来验证 NativeUser 用户(登录/密码验证)。但是关于其他类型的身份验证(OAuth),我还没有找到如何在身份验证过程中使用 Token JWT。当然,我不必使用会话。我之前谈到了会话以解释 Angular2 中匿名用户的情况。因此,我需要在使用 OAuth 进行身份验证后生成新的 JWT 令牌。 所以,身份验证的类型稍后并不重要,因为对于这两种类型的身份验证(OAuth 或登录/密码),用户将使用它的令牌从 Symfony3 获取 REST 数据以上是关于从 Symfony3 中经过身份验证的用户 (HWIOAuth) 获取 Angular2 中的 JWT 令牌的主要内容,如果未能解决你的问题,请参考以下文章
希望从经过身份验证的 Spotify 用户帐户中获取 Artist_id