我已经在这个问题上坚持了几天,我在这里感到很茫然。我已经通过OAuth 2为我们的网站实施了谷歌登录,它在我的计算机(本地环境)上可以在任何浏览器上完美运行,但是当我部署到我们的登台环境时,它只适用于谷歌浏览器。我们使用设计2.2.8 gem来处理身份验证以及 google-oauth2 0.2.6 以处理与Google登录的互动。我担心的一件事是我们的身份验证过程发生在2个不同的子域上,例如:
一旦用户被认证,他将只在my.website.com上浏览,但最初在被认证之前他在不同的子域。所以我想知道在认证过程中会话级别是否会出现问题?
以下是我希望通过谷歌浏览器上的登录环境通过Google登录验证自己的日志:
Jul 16 11:36:44(google_oauth2)请求阶段已启动。
Jul 16 11:36:44(google_oauth2)回调阶段已启动。
Jul 16 11:36:45 method = GET path = / users / auth / google_oauth2 / callback format = html controller = authentification / omniauth action = google_oauth2 status = 302 duration = 49.96 view = 0.00 location = http://my.website.com/ PARAMS = {"状态" = GT;" e6a565c411170cfcbc62d0209970bd39842aae090671a95a&#34 ;, "代码" = GT;" 4 / Ib0zrAHgAVNWli9RwJsXf9g7edcVlx96xVLmxCB4Eoc&#34 ;, " controller" =>" authentification / omniauth"," action" =>" google_oauth2"}
Jul 16 11:36:46 method = GET path = / format = html controller = my / dashboard action = index status = 200 duration = 839.57 view = 160.90 params = {" controller" =>" my / dashboard"," action" =>" index"}
以下是我想在Safari上的登台环境中通过Google登录验证身份的日志:
Jul 16 11:24:21(google_oauth2)请求阶段已启动。
Jul 16 11:24:22(google_oauth2)回调阶段已启动。
Jul 16 11:24:23 method = GET path = / users / auth / google_oauth2 / callback format = html controller = authentification / omniauth action = google_oauth2 status = 401 duration = 0.77 view = 0.00 PARAMS = {"状态" = GT;" 05e6567e2443eb5766c77a271d60a767a568b32491ce852c&#34 ;, "代码" = GT;" 4 / yNlgCDyI71mmYoT48BpWIJNnbaKzUhy7bclIxGHqJdo&#34 ;, " controller" =>" authentification / omniauth"," action" =>" google_oauth2"}
Jul 16 11:24:23(google_oauth2)回调阶段已启动。
7月16日11:24:23(google_oauth2)身份验证失败! invalid_credentials:OAuth2 :: Error,invalid_grant:代码已经存在 赎回。
Jul 16 11:24:23 {Jul 16 11:24:23"错误" :" invalid_grant",7月16日 11:24:23" error_description" :"代码已经兑换。" 7月16日 11:24:23}
由于回调阶段已启动两次,并且来自google oauth的令牌用于uniq用途,因此第二次回调显然会失败。
我在initialiser文件夹下有一个文件omniauth.rb文件,用于将Omniauth放在中间件堆栈中:
Rails.application.config.middleware.use OmniAuth::Builder do
provider :google_oauth2, "google-id", "secret", { scope: "email, profile, gmail.readonly, calendar"}
end
我知道有些人在定义Omniauth两次时遇到了与我相同的问题,因为他们在omniauth.rb文件和devise.rb中定义了它,所以我确保它只定义了一次。