我一直在寻找答案。
我有一个带有一些 REST 端点的 nodejs 服务器。每个端点都有 isLoggedIn
中间件,因此我可以通过它的电子邮件对用户进行身份验证。
客户端运行在4200端口,服务器运行在3113端口。
我基本上想要的是让我的客户在未通过身份验证的情况下重定向到 Google 的同意屏幕。由于端口不同,我得到:
XMLHttpRequest 无法加载 https://accounts.google.com/o/oauth2/v2/auth?response_type=code&redirect_ur…d=604408607019-ha937stehe6s3nk7ea892rviihrq5n4s.apps.googleusercontent.com。请求的资源上不存在“Access-Control-Allow-Origin” header 。因此不允许访问源“http://localhost:4200”。
现在,我还没有尝试过什么......:)
我尝试使用 CLI 代理功能(它是一个 webpack 配置)并将所有 /api
请求转发到服务器。
我已将 header 添加到服务器,但后来我意识到是 Google 发送了此错误,而不是我的服务器。
我在这里看到了很多相关的帖子。到目前为止,我所看到的最好的解决方案是放置一个login
按钮,然后将对auth
的调用放在href
中,因为我不能在域之间进行 ajax 调用。
这真的是最好的解决方案吗?在服务器上运行验证代码时,是否可以通过其他方式从客户端进行验证?
我什至添加了 API 的所有相关端口和对 Google 开发者控制台的回调调用。
顺便说一句,当从同一个端口为客户端提供服务时,一切正常。
谢谢。
最佳答案
有点晚了,但我有你的解决方案。我刚刚自己解决了这个问题,在寻找解决方案时偶然发现了您的问题。您将无法通过 Angular 从 google 身份验证本身调用 .http.get()
请求。您需要做的是重定向 window.location.href = 'your-express-uri-here'
然后当您进行身份验证时,您可以创建一个新的 Express 路由,并且从该路由本身获取用户数据。例如,您可以从角度调用 .http.get('your-profile')
,然后在您的快速 route 让您的路线成为 router.get('your-profile/', ( req, res) =>{ res.send(req.user) }
这是有效的,因为使用 Passport 你使用 cookie,当你登录时你已经通过身份验证,并且你可以访问用户的数据. 您不需要从登录中发出 GET 请求来获取用户数据,一旦您已经使用 Google+Passport 登录后,只需从您的 Node 应用程序发出 GET 请求。为此,您必须运行 Angular在您的 Node 应用程序的代理中。
关于node.js - 客户端(angular 2)身份验证, Passport 谷歌作为服务器(node.js)中的提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39692022/