【发布时间】:2018-03-05 08:32:10
【问题描述】:
这个问题适合任何熟悉的人
- Node.js
- 快递
- 护照
- 使用护照的 JWT 身份验证(JSON Web 令牌)
- Facebook OAuth2.0 或谷歌 OAuth2.0
我一直在做一些在线课程,并且了解如何做以下两件事:
- 使用 Passport 本地策略 + JWT 令牌进行身份验证
- 使用 Passport Google/Facebook 策略 + Cookie/会话进行身份验证。
我正在尝试将这两门课程的内容基本结合起来。我想使用 Google Strategy + JWT 身份验证。我想使用 JWT 而不是 cookie,因为我的应用程序将成为 web/mobile/tablet 应用程序,并且我需要从不同的域访问 api。
我有两个问题: 要启动 Google/facebook OAuth 管道,您需要调用“/auth/facebook”或“/auth/google”。两种 Oauth 流程的工作方式基本相同,因此当我从现在开始说“/auth/google”时,我指的是两者中的任何一个。现在我遇到的问题是:在客户端上,我是使用 href 按钮链接还是 axios/ajax 调用来调用“/auth/google”路由?如果我使用 href 或 axios/ajax 方法,我仍然会遇到两种解决方案的问题。
href 方法问题:
当我将带有 href 的 <a> 标记分配给“/auth/google”时,身份验证工作得非常好。用户通过 Google Auth 流程被推送,他们登录并调用“/auth/google/callback”路由。我现在遇到的问题是如何正确地将 JWT 令牌从“/auth/google/callback”发送回客户端?
经过大量谷歌搜索后,我发现人们只是将 JWT 从重定向查询参数中的 oauth 回调传递回客户端。例如:
res.redirect(301, `/dashboard?token=${tokenForUser(req.user)}`);
我遇到的问题是,现在身份验证功能已保存在我的浏览器历史记录中!我可以注销(销毁保存在 localStorage 中的令牌),然后只需查看我的浏览器 url 历史记录,返回查询参数中包含令牌的 url,我将自动再次登录而无需通过谷歌战略!这是一个巨大的安全漏洞,显然是错误的处理方法。
axios/ajax 方法问题: 现在,在我解释这个问题的问题之前,我确定如果我让它工作,它将解决我在之前的 href 问题中遇到的所有问题。如果我设法从 axios.get() 调用中调用“/google/auth”并在响应正文中接收 JWT,我将不会将令牌作为 url 参数发送,它也不会保存在浏览器历史记录中!完美对不对?好吧,这种方法仍然存在一些问题:(
当尝试调用axios.get('/auth/google') 时出现以下错误:
我是如何尝试解决问题的:
- 我在我的 npm 服务器上安装了 cors,并将
app.use(cors());添加到我的 index.js 中。 - 我在 Google 开发者控制台的“Authorised JavaScript origins”中添加了“http://localhost:3000”。
这些解决方案都没有解决这个问题,所以现在我真的觉得卡住了。我想使用 axios/ajax 方法,但我不确定如何克服这个 cors 错误。
很抱歉这么长的信息,但我真的觉得我必须给你所有的信息才能让你正确地帮助我。
再次感谢,期待您的回音!
【问题讨论】:
标签: oauth-2.0 jwt passport.js google-oauth facebook-oauth