【发布时间】:2016-10-06 19:30:39
【问题描述】:
所以我正在尝试使用 google oauth 为我的用户获取刷新令牌(实际上并未使用 google oauth 来保存用户)。当我将客户端 OAuth 用于 google api 时,我一切正常,但是当你进行握手时它们不提供刷新令牌,只提供 access_token。我需要一个持久的 refresh_token,因为我要向用户的谷歌日历发出很多请求。
所以我在我的 Rails 服务器上设置了omniauth,以使流程如下所示:
用户点击通过谷歌验证(客户端)-->
弹出屏幕转到后端服务器 (localhost:3001/users/auth/google_oauth2) -->
后端 Rails 服务器重定向到 google 进行身份验证 -->
他们通过 google 进行身份验证并被重定向到后端服务器的回调 (localhost:3001/users/auth/google_oauth2/callback) -->
后端服务器为适当的用户保存令牌,然后在localhost:3000 上重定向回客户端应用程序(客户端无需执行任何操作,只需将令牌保存在我的服务器上以备将来使用)
但是,我确实需要知道身份验证是否成功,以便我可以在 react/redux 中调度适当的操作。在 redux-auth 中,他们检查 popup.location URI 中的 access_token。问题是当我使用这个服务器端弹出流时,我得到了这个讨厌的 http/https 错误:
如果不是重定向回客户端,我只是重定向到后端服务器中的一个视图,那么我可以在该页面上有一个脚本,它只执行window.close(),它可以工作,但对我来说似乎很hacky。我在想的另一个潜在解决方案是尝试使用window.postMessage api,但我不知道它是否有很好的浏览器支持/似乎也很hacky。我可以从弹出窗口向另一个窗口(主客户端应用程序)发出一条消息,说明 oauth 成功,所以我的反应代码并做它需要做的任何事情。
我觉得我完全错误地处理了整个流程,或者我遗漏了一些明显的东西。
我还觉得,如果我在所有东西上都安装了 HTTPS,那么它就可以正常工作,因为之前它是 100% 客户端时,弹出窗口工作得很好,而且我没有收到这个 SecurityError。我花了一些时间弄清楚如何使用 https 获取我的 webpack 开发服务器,并尝试对 rails 做同样的事情(认为我在 rails 方面做错了)但它仍然无法正常工作。还觉得我不需要在我的所有开发服务器上强制使用 HTTPS 以使其正常工作......
如果有人有任何想法或可以给我一些方向,将不胜感激!
【问题讨论】:
-
您解决了这个问题吗?
标签: ruby-on-rails api authentication reactjs oauth-2.0