我在这里一直在寻找答案。
我有一个带有一些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开发者控制台。
顺便说一下,当客户端来自同一个端口时,一切正常。感谢。
答案 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到您的节点应用程序。