客户端(角度2)身份验证,护照谷歌作为服务器中的提供者(node.js)

时间:2016-09-25 21:28:29

标签: node.js authentication google-oauth passport.js angular-cli

我在这里一直在寻找答案。

我有一个带有一些REST端点的nodejs服务器。每个端点都有@model IEnumerable<DemoMvc.Models.ProduitModel> @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> </head> <body> <table class="table table-bordered"> <tr> <th>ProduitNom</th> <th>VonduDate</th> <th>ProduitPrix</th> </tr> @foreach (var item in Model) { <tr> <td>@item.ProduitNom</td> <td>@item.VonduDate.ToShortDateString()</td> <td>@item.ProduitPrix</td> </tr> } </table> </body> </html> 个中间件,因此我可以通过它的电子邮件对用户进行身份验证。

客户端在端口4200上运行,服务器在端口3113上运行。

我想要的是基本上让我的客户重定向到Google的同意屏幕(如果未经过身份验证)。由于端口不同,我得到:

isLoggedIn

现在,我尝试了什么......:)

我尝试使用CLI代理功能(它是一个webpack配置)并将所有XMLHttpRequest cannot load https://accounts.google.com/o/oauth2/v2/auth?response_type=code&redirect_ur…d=604408607019-ha937stehe6s3nk7ea892rviihrq5n4s.apps.googleusercontent.com. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access.请求转发到服务器。

我已将标题添加到服务器,但后来我意识到Google发送此错误而不是我的服务器。

我在这里看到很多相关的帖子。到目前为止,我看到的最佳解决方案是放置一个/api按钮,然后将调用login放在auth中,因为我无法在域之间进行ajax调用。 / p>

这真的是最好的解决方案吗?当身份验证代码在服务器上运行时,是不是可以从客户端进行身份验证?

我甚至为api添加了所有相关端口,并将回调调用添加到Google开发者控制台。

顺便说一下,当客户端来自同一个端口时,一切正常。

感谢。

1 个答案:

答案 0 :(得分:0)

有点晚了,但我有你的解决方案。我自己解决了这个问题,当我在寻找解决方案时,我偶然发现了你的问题。您将无法通过Angular从Google身份验证本身调用.http.get()请求。您需要做的是重定向window.location.href = 'your-express-uri-here',然后在进行身份验证时,您可以创建一个新的Express路由,并从该路由本身获取用户数据。例如,您可以从角度调用.http.get('your-profile')然后在您的快速路线中,您的路线为router.get('your-profile/', (req, res) =>{ res.send(req.user) }这是有效的,因为使用Passport您使用cookie并且当您登录时您已经过身份验证,并且您已经访问用户的数据。您不需要从登录中获取GET请求以获取用户数据,只需在您使用Google + Passport登录后从您的节点应用获取GET请求即可。为此,您必须在代理中运行Angular到您的节点应用程序。