node.js - 客户端(angular 2)身份验证, Passport 谷歌作为服务器(node.js)中的提供者

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

我一直在寻找答案。

我有一个带有一些 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/

相关文章:

java - 从刷新 token 获取访问 token 失败,并出现 invalid_grant 错误,并且错误请求或 token 已过期或撤销作为错误描述

javascript - 比较列表时我的 Node.js 会锁定吗?

authentication - 有人有关于 CAS 代理授予票证的有效示例吗?

c# - 如何在 C# 中使用 WebRequest 和 HttpWebResponse 导航到身份验证 URL 并登录网站?

http - 通过 HTTP 将受密码保护的文档发布到 Solr

python - Google CloudSQLAdmin - 服务帐户没有存储桶所需的权限

asp.net-mvc-4 - asp.net mvc DotNetOpenAuth.GoogleOAuth2。 'This app would like to have offline access'

javascript - 使用 Chai-HTTP 发布时似乎有错误的内容类型

javascript - Node.js函数在返回数据之前返回null/实现回调

node.js - 我使用nvm安装了最新的node.js版本,但是当我尝试更新npm时,它不起作用